Синглтон в Android



я пошел по этой ссылке и успешно сделал одноэлементный класс В Android.
http://www.devahead.com/blog/2011/06/extending-the-android-application-class-and-dealing-with-singleton/



проблема в том, что я хочу один объект. как у меня есть Activity A и Activity B. В Activity a я получаю доступ к объекту из Singleton class. Я использую объект и внес в него некоторые изменения.



когда я перехожу к действию B и получаю доступ к объекту из Синглтона Класс он дал мне инициализированный объект и не Сохранить изменения, которые я сделал в А. деятельность
Есть ли другой способ сохранить изменения?
Пожалуйста, помогите мне эксперты.
Это MainActivity



public class MainActivity extends Activity {
protected MyApplication app;
private OnClickListener btn2=new OnClickListener() {
@Override
public void onClick(View arg0) {
Intent intent=new Intent(MainActivity.this,NextActivity.class);
startActivity(intent);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

//Get the application instance
app = (MyApplication)getApplication();

// Call a custom application method
app.customAppMethod();

// Call a custom method in MySingleton
Singleton.getInstance().customSingletonMethod();

Singleton.getInstance();
// Read the value of a variable in MySingleton
String singletonVar = Singleton.customVar;

Log.d("Test",singletonVar);
singletonVar="World";
Log.d("Test",singletonVar);

Button btn=(Button)findViewById(R.id.button1);
btn.setOnClickListener(btn2);
}


}



это NextActivity



public class NextActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_next);

String singletonVar = Singleton.customVar;

Log.d("Test",singletonVar);
}}


Singleton класс



public class Singleton
{
private static Singleton instance;

public static String customVar="Hello";

public static void initInstance()
{
if (instance == null)
{
// Create the instance
instance = new Singleton();
}
}

public static Singleton getInstance()
{
// Return the instance
return instance;
}

private Singleton()
{
// Constructor hidden because this is a singleton
}

public void customSingletonMethod()
{
// Custom method
}
}


и MyApplication



public class MyApplication extends Application
{
@Override
public void onCreate()
{
super.onCreate();

// Initialize the singletons so their instances
// are bound to the application process.
initSingletons();
}

protected void initSingletons()
{
// Initialize the instance of MySingleton
Singleton.initInstance();
}

public void customAppMethod()
{
// Custom application method
}
}


когда я запускаю этот код, я получаю "Привет", который я активировал в Singleton тогда мир, в котором я его отдал MainActivity и снова показывает Привет в NextActivity в logcat.
Я хочу, чтобы он снова показал мир в NextActivity.
Пожалуйста, помогите мне исправить это.

1280   8  

8 ответов:

EDIT:

реализация синглтона в Android небезопасна, и вы должны использовать библиотеку, посвященную такому типу шаблона, как Кинжал или другая библиотека DI для управления жизненным циклом и инъекцией.


могли бы вы опубликовать пример кода ?

взгляните на эту суть:https://gist.github.com/Akayh/5566992

это работает, но это было очень сделано быстро :

MyActivity: установите синглтон в первый раз + инициализируйте атрибут mString ("Hello") в частном конструкторе и покажите значение ("Hello")

установите новое значение в mString:"Singleton"

запустите activityB и покажите значение mString. Появляется "синглтон"...

Совет: чтобы создать класс singleton в Android Studio, щелкните правой кнопкой мыши в своем проекте и откройте меню:

New -> Java Class -> Choose Singleton from dropdown menu

enter image description here

это просто, как java, Android также поддерживает синглтон. -

Синглтон является частью банды из четырех шаблонов проектирования, и он классифицируется в соответствии с творческими шаблонами проектирования.

-> статический член: содержит экземпляр одноэлементного класса.

-> Private constructor: это помешает кому-либо еще создать экземпляр класса Singleton.

-> статический открытый метод: это обеспечивает глобальную точку доступа к синглтону объект и возвращает экземпляр вызывающему классу клиента.

  1. создать отдельный экземпляр
  2. создать приватный конструктор
  3. используйте getInstance () Одноэлементного класса

    public class Logger{
    private static Logger   objLogger;
    private Logger(){
    
            //ToDo here
    
    }
    public static Logger getInstance()
    {
        if (objLogger == null)
       {
          objLogger = new Logger();
       }
       return objLogger;
       }
    
    }
    

в то время как использовать синглтон -

Logger.getInstance();

ответ, предложенный Ракешем, велик, но все же с некоторым описанием Синглтон в Android-это то же самое, что синглтон в Java: Одноэлементный шаблон проектирования решает все эти проблемы. С помощью шаблона Одноэлементного дизайна вы можете:

1) Убедитесь, что создан только один экземпляр класса

2) обеспечить глобальную точку доступа к объекту

3) разрешить несколько экземпляров в будущем, не затрагивая класс синглтона клиенты

пример базового Одноэлементного класса:

public class MySingleton
{
    private static MySingleton _instance;

    private MySingleton()
    {

    }

    public static MySingleton getInstance()
    {
        if (_instance == null)
        {
            _instance = new MySingleton();
        }
        return _instance;
    }
}

Как @Lazy заявил в ответ, вы можете создать синглтон из шаблона в Android Studio. Стоит отметить, что нет необходимости проверять, является ли экземпляр null, потому что статический ourInstance переменная инициализируется первой. В результате реализация класса singleton, созданная Android Studio, так же проста, как и следующий код:

public class MySingleton {
    private static MySingleton ourInstance = new MySingleton();

    public static MySingleton getInstance() {
        return ourInstance;
    }

    private MySingleton() {
    }
}

вы копируете синглтона customVar на singletonVar переменная и изменение этой переменной не влияет на исходное значение в синглтоне.

// This does not update singleton variable
// It just assigns value of your local variable
Log.d("Test",singletonVar);
singletonVar="World";
Log.d("Test",singletonVar);

// This actually assigns value of variable in singleton
Singleton.customVar = singletonVar;

Я поставил свою версию Синглтона ниже:

public class SingletonDemo {
    private static SingletonDemo instance = null;
    private static Context context;

    /**
     * To initialize the class. It must be called before call the method getInstance()
     * @param ctx The Context used

     */
    public static void initialize(Context ctx) {
     context = ctx;
    }

    /**
     * Check if the class has been initialized
     * @return true  if the class has been initialized
     *         false Otherwise
     */
    public static boolean hasBeenInitialized() {
     return context != null;

    }

    /**
    * The private constructor. Here you can use the context to initialize your variables.
    */
    private SingletonDemo() {
        // Use context to initialize the variables.
    }

    /**
    * The main method used to get the instance
    */
    public static synchronized SingletonDemo getInstance() {
     if (context == null) {
      throw new IllegalArgumentException("Impossible to get the instance. This class must be initialized before");
     }

     if (instance == null) {
      instance = new SingletonDemo();
     }

     return instance;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        throw new CloneNotSupportedException("Clone is not allowed.");
    }
}

обратите внимание, что метод initialize может быть вызван в основном классе(Splash), а метод getInstance может быть вызван из других классов. Это устранит проблему, когда вызывающий класс требует синглтон, но у него нет контекста.

наконец, метод hasBeenInitialized используется для проверки, если класс был инициализирован. Это позволит избежать того, что разные экземпляры имеют разные контексты.

самый чистый и современный способ использования синглетов в Android-это просто использовать Инъекции Зависимостей программы Кинжал 2. здесь у вас есть объяснение возможных областей можно использовать. Синглтон - одна из таких областей. Инъекция зависимости не так проста, но вы должны инвестировать немного своего времени, чтобы понять это. Это также упрощает тестирование.

Comments

    Ничего не найдено.