Gibt es eine Möglichkeit, die aktuelle Context
Instanz innerhalb einer statischen Methode?
Ich bin auf der Suche nach dieser Möglichkeit, weil ich es hasse, die Instanz "Context" jedes Mal zu speichern, wenn sie sich ändert.
Gibt es eine Möglichkeit, die aktuelle Context
Instanz innerhalb einer statischen Methode?
Ich bin auf der Suche nach dieser Möglichkeit, weil ich es hasse, die Instanz "Context" jedes Mal zu speichern, wenn sie sich ändert.
Ich verwende eine Variation des Singleton-Designmusters, um mir dabei zu helfen.
import android.app.Activity;
import android.content.Context;
public class ApplicationContextSingleton {
private static Activity gContext;
public static void setContext( Activity activity) {
gContext = activity;
}
public static Activity getActivity() {
return gContext;
}
public static Context getContext() {
return gContext;
}
}
Ich rufe dann ApplicationContextSingleton.setContext( this );
in meinem activity.onCreate() y ApplicationContextSingleton.setContext( null );
en onDestroy() ;
Ich habe gerade ein von jQuery inspiriertes Framework für Android mit dem Namen Dampf-API das die App-Entwicklung vereinfachen soll.
Die zentrale $
Fassadenklasse unterhält eine WeakReference
(Link zu einem großartigen Java-Blogbeitrag von Ethan Nicholas) zum aktuellen Activity
Kontext, den Sie durch Aufruf abrufen können:
$.act()
A WeakReference
behält einen Verweis bei, ohne zu verhindern, dass die Garbage Collection das ursprüngliche Objekt zurückfordert, so dass Sie keine Probleme mit Speicherlecks haben sollten.
Der Nachteil ist natürlich, dass Sie das Risiko eingehen, dass $.act()
könnte Null zurückgeben. Ich habe nicht über dieses Szenario noch aber gekommen, so ist es vielleicht nur ein minimales Risiko, erwähnenswert.
Sie können den Kontext auch manuell festlegen, wenn Sie nicht mit VaporActivity
als Ihr Activity
Klasse:
$.act(Activity);
Außerdem wird ein Großteil der Dampf-API Framework verwendet diesen gespeicherten Kontext von Haus aus, was bedeuten kann, dass Sie ihn nicht selbst speichern müssen, wenn Sie sich für die Verwendung des Frameworks entscheiden. Schauen Sie sich die Website für weitere Informationen und Muster.
Ich hoffe, das hilft :)
Heute der richtige Weg zu haben context
ist die Verwendung von Dependency Injection. Zum Beispiel kann man Hilt verwenden, um den Kontext an jeder Stelle zu injizieren, an der er benötigt wird. Nehmen wir an, man braucht context
in einem Datenbankmanager, dann kann dies wie folgt gelöst werden:
Hilt in Gradle hinzufügen:
implementation "com.google.dagger:hilt-android:2.35"
kapt "com.google.dagger:hilt-android-compiler:2.35"
Definieren Sie die Anwendungsklasse mit @HiltAndroidApp
Anmerkung (z.B. den Datenbankmanager einbinden):
@HiltAndroidApp
class MyApplication : Application() {
@Inject
lateinit var dbManager: DBManager
override fun onCreate() {
super.onCreate()
dbManager.initDB()
}
}
Definieren Sie den Datenbankmanager (lassen Sie ihn @Singleton
zum Beispiel auch):
@Singleton
class DBManager @Inject constructor(
@ApplicationContext private val context: Context
) {
fun initDB() {
// context is avaiable
databaseInit(context)
}
}
Und das war's. Die DBManager
in der richtigen Weise auf den Kontext zugreifen kann, ohne dass Speicherlecks entstehen.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.