2010-11-18 11 views
10

Se interpreto correttamente questo article, passare il contesto dell'attività a AsyncTasks è una potenziale perdita, poiché l'attività potrebbe essere distrutta mentre l'attività è ancora in esecuzione.Il contesto Android perde in AsyncTask

Come si fa a gestire questo in AsyncTasks che non sono interni e che richiedono l'accesso alle risorse o l'aggiornamento dell'interfaccia utente?

Inoltre, come evitare di filtrare il contesto se sono necessari riferimenti alle finestre di dialogo di avanzamento per chiuderli?

+0

Guarda [this] (http://stackoverflow.com/questions/3821423/background-task-progress-dialog-orientation-change-is-there-any-100-working/3821998#3821998). Riguarda i cambiamenti di orientamento, ma si tratta di mantenere in modo sicuro un riferimento a un'attività/contesto. –

risposta

11

Se ho compreso correttamente la tua domanda: la classe WeakReference o SoftReference di Java è adatta per questo tipo di situazione. Ti permetterà di passare il contesto all'AsyncTask senza impedire al GC di liberare il contesto se necessario.

Il GC è più desideroso quando raccoglie WeakReferences piuttosto che quando raccoglie SoftReferences.

invece di:

FooTask myFooTask = new FooTask(myContext); 

il codice sarà simile:

WeakReference<MyContextClass> myWeakContext = new WeakReference<MyContextClass>(myContext); 
FooTask myFooTask = new FooTask(myWeakContext); 

e nel AsyncTask invece di:

myContext.someMethod(); 

il codice sarà simile:

myWeakContext.get().someMethod(); 
+4

assicurati che myWeakContext.get() non restituisca nulla, altrimenti hai sbagliato. –

+0

Funziona se non è strettamente necessario eseguire gli aggiornamenti dell'interfaccia utente al termine dell'attività. Se i risultati dell'attività asincrona sono necessari dopo che l'attività è stata ricreata, sarà necessario utilizzare un approccio diverso. I frammenti senza testa impostati per conservare lo stato possono gestire i tuoi compiti. – r1k0

Problemi correlati