Domanda

Ho un progetto che utilizza AsyncTask per ottenere il lavoro fatto in background.
Questo progetto utilizza anche una classe come un supporto generico per valori statici come chiavi di database, ma anche per uno o due oggetti utili per l'intero progetto. Diciamo che questa classe si chiama public class Constants.

voglio accedere uno di questi oggetti provenienti da un AsyncTask, e non so se ho bisogno di copiare o meno.
Io non sono in realtà sempre errori o crash, ma ho un po 'di feedback degli utenti segnalazione crash che non riesco a riprodurre, in modo da sto gessing sto facendo qualcosa di sbagliato in questo.

Il mio trattamento attuale è questa:

onStart() {// somewhere in the UI thread  
new MyTask(Constants.theObject).execute(); // (1)  
}  
// ...  
class MyTask extends AsyncTask<...> {  
MyObjectType object;  
MyTask(MyObjectType theObjectInstance) {  
object = theObjectInstance; // (2)  
// ...  
doInBackground() { // (3)  
//  ...  
} 

In (1), Constants.theObject è un oggetto statico creato all'avvio dell'applicazione

In (2), ottengo un riferimento all'oggetto statica esistente Constants.theObject

In (3), non siamo più nel thread UI, e voglio l'accesso Constants.theObject (che può anche essere utilizzato nel thread principale)

.

Penso che ci siano tre casi possibili.

  • questo codice è brutto, devo fare altrimenti
  • questo codice è OK, il feedback degli utenti non si tratta di questo
  • questo codice è piuttosto male, ma devo fare una copia di Constants.theObject se voglio usarlo in doInBackground; altrimenti si può fallire

Spero che mi può aiutare! Grazie mille per la lettura.

È stato utile?

Soluzione

Da quello che hai scritto, non credo che avete bisogno di fare una copia, a meno che non MyObjectType non è thread-safe, in tal caso, è necessario assicurarsi che solo 1 thread alla volta sta modificando è / è safe-metodi -non-thread. (Creazione di una copia sarebbe davvero a risolvere questo, ma se si può fare una copia, è una società globale statico davvero quello che si dovrebbe usare in ogni caso?)

Sei sicuro al 100% che l'1 e 3 possono avvenire solo dopo che l'oggetto è stato inizializzato?

Altri suggerimenti

Può essere perché più un thread sta cercando di cambiare lo stesso oggetto. può causare risultati inattesi / completo fallimento. Si può desiderare di utilizzare alcuni di blocco in modo che nessun 2 thread possono aggiorna l'oggetto allo stesso tempo. Questo caso sarà rallentare le operazioni asynch come tutti dipendono esattamente uno intance. Credo che si sta utilizzando oggetto statico per una ragione, si può prendere in considerazione ci fa qualche altro modo, se possibile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top