Ich bin diesem Link gefolgt und habe erfolgreich Singleton-Klasse in Android gemacht. http://www.devahead.com/blog/2011/06/extending-the-android-application-class-and-dealing-with-singleton/
Problem ist, dass ich ein einzelnes Objekt möchte. wie ich habe Aktivität A und Aktivität B. In Aktivität AI Zugriff auf das Objekt von Singleton class
. Ich benutze das Objekt und habe einige Änderungen daran vorgenommen.
Wenn ich zu Aktivität B wechsle und von der Singleton-Klasse aus auf das Objekt zugreife, habe ich das initialisierte Objekt erhalten und die in Aktivität A vorgenommenen Änderungen nicht beibehalten. Gibt es eine andere Möglichkeit, die Änderung zu speichern? Bitte helfen Sie mir Experten. Das istMainActivity
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);
}
}
Das ist 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
Klasse
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
}
}
und 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
}
}
Wenn ich diesen Code ausführe, erhalte ich Hello, das ich in der Singleton
Welt initialisiert habe, in der ich es gegeben habe, MainActivity
und zeigt Hello NextActivity
in logcat erneut an. Ich möchte, dass es die Welt wieder zeigt NextActivity
. Bitte helfen Sie mir, dies zu korrigieren.
Antworten:
EDIT:
Die Implementierung eines Singleton in Android ist nicht "sicher" ( siehe hier ) und Sie sollten eine Bibliothek verwenden, die dieser Art von Muster gewidmet ist, wie Dagger oder eine andere DI-Bibliothek, um den Lebenszyklus und die Injektion zu verwalten.
Könnten Sie ein Beispiel aus Ihrem Code posten?Schauen Sie sich dieses Wesentliche an: https://gist.github.com/Akayh/5566992
es funktioniert, aber es war sehr schnell erledigt:
MyActivity: Setzen Sie den Singleton zum ersten Mal + initialisieren Sie das mString-Attribut ("Hello") im privaten Konstruktor und zeigen Sie den Wert ("Hello") an.
Setzen Sie den neuen Wert auf mString: "Singleton"
Starten Sie activityB und zeigen Sie den mString-Wert an. "Singleton" erscheint ...quelle
synchronized
keyworkd in IhrergetInstance()
Methode zu verwenden.Tipp: So erstellen Sie eine Singleton-Klasse Klicken Sie in Android Studio mit der rechten Maustaste in Ihr Projekt und öffnen Sie das Menü:
New -> Java Class -> Choose Singleton from dropdown menu
quelle
Es ist einfach, als Java unterstützt Android auch Singleton. - -
Singleton ist Teil des Gang of Four-Designmusters und wird unter Kreationsdesignmuster kategorisiert.
-> Statisches Mitglied: Enthält die Instanz der Singleton-Klasse.
-> Privater Konstruktor: Dadurch wird verhindert, dass andere Personen die Singleton-Klasse instanziieren.
-> Statische öffentliche Methode: Hiermit wird der globale Zugriffspunkt auf das Singleton-Objekt bereitgestellt und die Instanz an die aufrufende Clientklasse zurückgegeben.
Verwenden Sie getInstance () der Singleton-Klasse
public class Logger{ private static Logger objLogger; private Logger(){ //ToDo here } public static Logger getInstance() { if (objLogger == null) { objLogger = new Logger(); } return objLogger; } }
während Singleton verwenden -
Logger.getInstance();
quelle
Die von Rakesh vorgeschlagene Antwort ist großartig, aber mit einigen Beschreibungen ist Singleton in Android dieselbe wie Singleton in Java: Das Singleton-Entwurfsmuster behebt all diese Probleme. Mit dem Singleton-Entwurfsmuster können Sie:
Ein einfaches Beispiel für eine Singleton-Klasse:
public class MySingleton { private static MySingleton _instance; private MySingleton() { } public static MySingleton getInstance() { if (_instance == null) { _instance = new MySingleton(); } return _instance; } }
quelle
getInstance()
er zum ersten Mal aufgerufen wird.Wie in dieser Antwort von @Lazy angegeben , können Sie in Android Studio aus einer Vorlage einen Singleton erstellen. Es ist zu beachten, dass nicht überprüft werden muss, ob die Instanz null ist, da die statische
ourInstance
Variable zuerst initialisiert wird. Daher ist die von Android Studio erstellte Implementierung der Singleton-Klasse so einfach wie der folgende Code:public class MySingleton { private static MySingleton ourInstance = new MySingleton(); public static MySingleton getInstance() { return ourInstance; } private MySingleton() { } }
quelle
Sie kopieren Singletons
customVar
in einesingletonVar
Variable und das Ändern dieser Variablen wirkt sich nicht auf den ursprünglichen Wert in Singleton aus.// 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;
quelle
Ich habe meine Version von Singleton unten angegeben:
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."); } }
Beachten Sie, dass die Methodeninitialisierung in der Hauptklasse (Splash) und die Methode getInstance von anderen Klassen aufgerufen werden kann. Dies behebt das Problem, wenn die Aufruferklasse den Singleton benötigt, aber nicht über den Kontext verfügt.
Schließlich wird mit der Methode hasBeenInitialized überprüft, ob die Klasse initialisiert wurde. Dadurch wird vermieden, dass unterschiedliche Instanzen unterschiedliche Kontexte haben.
quelle
Die sauberste und modernste Art, Singletons in Android zu verwenden, ist die Verwendung des Dependency Injection- Frameworks namens Dagger 2 . Hier finden Sie eine Erläuterung der möglichen Bereiche, die Sie verwenden können. Singleton ist einer dieser Bereiche. Die Abhängigkeitsinjektion ist nicht so einfach, aber Sie sollten ein wenig Zeit investieren, um sie zu verstehen. Dies erleichtert auch das Testen.
quelle