Statische variabelen gebruiken in Android

Is het gebruik van statische variabelen in Android een aanbevolen praktijk?
Als ik bijvoorbeeld een Singleton-patroon in Javaimplementeer, doe ik meestal:

private static A the_instance;
public static A getInstance() {
    if (the_instance == null) {
       the_instance = new A();
    }
    return the_instance;
}

Bovendien, wanneer wordt dit opgeschoond door de Android JVM?


Antwoord 1, autoriteit 100%

staticvelden zijn gekoppeld aan de Classinstantie als geheel, die op zijn beurt is gekoppeld aan de ClassLoaderdie de klasse heeft geladen. the_instancezou worden verwijderd wanneer de volledige ClassLoaderwordt teruggewonnen. Ik ben er 90% zeker van dat dit gebeurt wanneer Android de app vernietigt (niet wanneer deze naar de achtergrond gaat of pauzeert, maar volledig wordt afgesloten.)

Dus beschouw het als levend zolang uw app draait. Is Singleton een goed idee? Mensen hebben verschillende opvattingen. Ik vind het zelf prima als het op de juiste manier wordt gebruikt. Ik denk niet dat het antwoord veel verandert op Android. Geheugengebruik is niet per se het probleem; als je een heleboel dingen in het geheugen moet laden, is dat een probleem of niet, ongeacht of je de gegevens in een Singleton inkapselt.


Antwoord 2, autoriteit 23%

Ik denk dat statische variabelen in orde zijn.

Dit is wat Android-documentatie zegt:

http://developer.android.com/guide/appendix/faq/ framework.html

Hoe geef ik gegevens door tussen activiteiten/diensten binnen één applicatie?

Een openbaar statisch veld/methode

Een alternatieve manier om gegevens voor alle activiteiten/services toegankelijk te maken, is door openbare statische velden en/of methoden te gebruiken. U hebt toegang tot deze statische velden vanuit elke andere klasse in uw toepassing. Om een ​​object te delen, stelt de activiteit die uw object maakt een statisch veld in om naar dit object te verwijzen en elke andere activiteit die dit object wil gebruiken, heeft alleen toegang tot dit statische veld.


Antwoord 3, autoriteit 2%

In tegenstelling tot wat andere mensen zeggen, is het meer dan oké. Toegegeven, er zit een zekere structuur in. In de officiële repo van googlesamples/android-architecture wordt het gebruikt onder todo-mvp-clean (Todo-app implementeert MVP-patroon en volgt Clean Architecture-principes).
Bekijk deze bestand.

Wat je kunt zien zijn veel statische methoden die verwijzen naar singleton getters.

Modern, minder foutgevoelig en handig alternatief is het Dagger DI-framework.


Antwoord 4

Ik weet niet zeker of een dergelijke aanpak goed is voor een mobiel platform waar je beperkt geheugen tot je beschikking hebt. Om nog maar te zwijgen van het feit dat de applicatie zal worden uitgevoerd op een multi-tasking-apparaat.

Ik denk dat deze benadering het geheugen van het apparaat kan vervuilen, maar ik heb geen document om dit te ondersteunen. Misschien kan iemand met een hogere opleiding dan ik zijn mening delen.


Antwoord 5

Nee. Doe het niet! Singleton is een anti-patroon!. Gebruik in plaats daarvan afhankelijkheidsinjectie, hetzij via een framework (zoals via Daggerof Roboguice) of door het geïnstantieerde object expliciet door te geven.

Other episodes