2012-12-11 20 views
9

Ok, quindi ora ho Class A che contiene alcuni filatori che i valori saranno compilati da Class B che si estende AsnycTask che acquisisce i valori di selezione da un servizio Web. In classe B riesco a recuperare i valori, mostrando in un toast. Il problema ora è come posso passare quei valori di spinner di nuovo alla classe A?Valore restituito dalla classe AsyncTask Metodo onPostExecute

Ho provato

Can OnPostExcecute method in AsyncTask RETURN values?

passando Class A-Class B e memorizzare il valore in una variabile pubblica di Class A come qui di seguito

@Override 
protected void onPostExecute(String result) 
{ 
    classA.classAvariable = result; 
} 

Tuttavia ogni volta che provo a leggere la classAvariable i ottieni sempre un NullPointer Exception. Sembra che la variabile non sia mai stata assegnata al risultato. Per motivi di leggibilità, ho dovuto separare Class B invece di utilizzarlo come classe in linea.

Qualche idea ai miei colleghi programmatori Java?

+0

fornire il codice che avete scritto –

risposta

29

Credo che si sta tentando di leggere classe Una variabile prima che sia stato impostato .. provare a farlo usando callbacks..in la funzione di callback passare i valori e rinfrescare la filatori ..

È possibile creare interface, passarlo al AsyncTask (nel costruttore), e quindi chiamare metodo onPostExecute

ad esempio:

L'interfaccia:

public interface OnTaskCompleted{ 
    void onTaskCompleted(values); 
} 

vostra attività:

public YourActivity implements OnTaskCompleted{ 
    //your Activity 
    YourTask task = new YourTask(this); // here is the initalization code for your asyncTask 
} 

E la tua AsyncTask:

public YourTask extends AsyncTask<Object,Object,Object>{ //change Object to required type 
    private OnTaskCompleted listener; 

    public YourTask(OnTaskCompleted listener){ 
     this.listener=listener; 
    } 

    //required methods 

    protected void onPostExecute(Object o){ 
     //your stuff 
     listener.onTaskCompleted(values); 
    } 
} 
+0

Grazie cosí! Tuttavia ti spiace spiegare la logica su questo codice? Perché sembra simile all'implementazione di un metodo getter nella classe AsyncTask (anche se non funziona nella realtà). –

+2

è una specie di funzione di callback che invece di passare l'attività all'attività, stai passando un listener, (come il listener dei pulsanti) quando l'attività è completata chiama il callback (chiama l'attività che implementa questo callback) e poi il attività fa quello che vuole – Nermeen

+1

Correggetemi se ho torto, per la mia logica l'implementazione dell'interfaccia viene chiamata quando si esegue AsyncTask mentre l'implementazione di un metodo getter potrebbe non funzionare perché l'AsyncTask potrebbe non essere completato prima che venga chiamato il metodo. È corretto? –

0

creare un'interfaccia simile OnCompletRequest() poi passare questo al vostro costruttore di ClassB e semplicemente chiamare il metodo all'interno di questa interfaccia, come complete(yourList list) nel metodo di onPostExecute(String result)

+0

Ti dispiace fornire uno snippet di codice breve? Non sono chiaro come implementare l'interfaccia nella classe AsyncTask. –

+0

Ho appena aggiornato il codice di @Nunu per aiutarti a capire come funzionerà. –

+0

Grazie mille! E 'stato molto utile! –

1

Il problema è che quando si esegue AsynchTask, il suo metodo doInBackground() viene eseguito in un thread separato e il thread che ha avviato questo AsynchTask spostarsi in avanti, In tal modo le modifiche si verificano sulla variabile da AsynchTask non riflette sul thread padre (che ha dichiarato questo AsynchTask) immediatamente.

Esempio -

class MyAsynchTask 
{ 

doInbackground() 
{ 
a = 2; 
} 

} 


int a = 5; 

new MyAsynchTask().execute(); 

// qui un essere ancora 5

+0

beh se hai letto il mio codice ho fatto il compito nel metodo onPostExecute .. che dovrebbe essere in esecuzione sul thread dell'interfaccia utente no? –

+0

si! onPostExecute viene eseguito nel thread dell'interfaccia utente ma dopo il completamento di doInbackground. – Mufazzal

Problemi correlati