Синглтон в 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.
Пожалуйста, помогите мне исправить это.
8 ответов:
EDIT:
реализация синглтона в Android небезопасна, и вы должны использовать библиотеку, посвященную такому типу шаблона, как Кинжал или другая библиотека DI для управления жизненным циклом и инъекцией.
могли бы вы опубликовать пример кода ?взгляните на эту суть:https://gist.github.com/Akayh/5566992
это работает, но это было очень сделано быстро :
MyActivity: установите синглтон в первый раз + инициализируйте атрибут mString ("Hello") в частном конструкторе и покажите значение ("Hello")
установите новое значение в mString:"Singleton"
запустите activityB и покажите значение mString. Появляется "синглтон"...
это просто, как java, Android также поддерживает синглтон. -
Синглтон является частью банды из четырех шаблонов проектирования, и он классифицируется в соответствии с творческими шаблонами проектирования.
-> статический член: содержит экземпляр одноэлементного класса.
-> Private constructor: это помешает кому-либо еще создать экземпляр класса Singleton.
-> статический открытый метод: это обеспечивает глобальную точку доступа к синглтону объект и возвращает экземпляр вызывающему классу клиента.
- создать отдельный экземпляр
- создать приватный конструктор
используйте 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