il mio problema è lo stesso di questo Instance variable of Activity not being set in onPostExecute of AsyncTask or how to return data from AsyncTask to main UI thread ma voglio inviare i dati alla stessa attività di chiamata. Doesnt startActivity per intent riavvia sempre l'attivitàCome posso inviare i dati da onPostExecute in un AsyncTask?
risposta
Sulla possibilità è quella di utilizzare gli ascoltatori, in cui si crea un'interfaccia che i vostri implents attività, qualcosa di simile:
public interface AsyncListener {
public void doStuff(MyObject obj);
}
In questo modo, Se stai sottoclassi AsyncTask, è facile aggiungere questo listener, quindi in onPostExecute(), potresti fare qualcosa del tipo:
protected void onPostExecute(MyObject obj) {
asyncListener.doStuff(obj);
}
Questo dipende dalla struttura della classe, ma se AsyncTask è una classe all'interno della tua attività, puoi fare riferimento ai metodi di tale attività. Cosa si dovrebbe fare è nel metodo OnPostExecute chiamare una funzione della vostra attività che passa un po 'di dati che sono stati recuperati nel AsyncTask all'attività dove è quindi possibile utilizzare esso ..
Il codice sarebbe simile a questa
class YourActivity extends Activity {
private static final int DIALOG_LOADING = 1;
public void onCreate(Bundle savedState) {
setContentView(R.layout.yourlayout);
showDialog(DIALOG_LOADING);
new LongRunningTask1().execute(1,2,3);
}
protected Dialog onCreateDialog(int dialogId) {
switch(dialogId) {
case DIALOG_LOADING:
ProgressDialog pDialog = new ProgressDialog(this);
pDialog.setTitle("Loading Data");
pDialog.setMessage("Loading Data, please wait...");
return pDialog;
default:
return super.onCreateDialog(dialogId);
}
}
private void onBackgroundTaskDataObtained(List<String> results) {
dismissDialog(DIALOG_LOADING);
//do stuff with the results here..
}
private class LongRunningTask extends AsyncTask<Long, Integer, List<String>> {
@Override
protected void onPreExecute() {
//do pre execute stuff
}
@Override
protected List<String> doInBackground(Long... params) {
List<String> myData = new ArrayList<String>();
for (int i = 0; i < params.length; i++) {
try {
Thread.sleep(params[i] * 1000);
myData.add("Some Data" + i);
} catch(InterruptedException ex) {
}
}
return myData;
}
@Override
protected void onPostExecute(List<String> result) {
YourActivity.this.onBackgroundTaskDataObtained(result);
}
}
}
Quindi il flusso tipico è simile a questo, imposta la vista della pagina corrente e quindi mostra una finestra di avanzamento. Subito dopo inizia il task asincrono (o quando, non importa davvero).
Una volta completata l'attività asincrona, chiamare una funzione dell'attività e passarla ai dati. Non utilizzare i dati condivisi all'interno dell'attività asincrona o rischi di problemi con la filettatura. Al contrario, una volta terminato, passalo all'attività. Se si desidera aggiornare la vista progressivamente mentre si fa il lavoro è possibile utilizzare sul onProgressUpdate
- 1. onPostExecute su AsyncTask annullato
- 2. Eseguire un altro AsyncTask in onPostExecute()
- 3. AsyncTask Android non chiama onPostExecute
- 4. Valore restituito dalla classe AsyncTask Metodo onPostExecute
- 5. Come passare i dati da AsyncTask a Ui Thread
- 6. Asynctask: passa due o più valori da doInBackground a onPostExecute
- 7. Restituire dati da AsyncTask Android
- 8. AsyncTask onPostExecute() non chiamato in Unit Test Case
- 9. Restituisci i dati dalla classe AsyncTask
- 10. Android AsyncTask onPostExecute off del thread ui principale
- 11. Come posso inviare i dati a un url usando QNetworkAccessManager
- 12. AsyncTask per l'aggiornamento del widget: come accedere alle visualizzazioni di testo in onPostExecute()?
- 13. Come posso inviare indietro i dati usando finish?
- 14. onPostExecute non viene chiamato
- 15. Chiamata AsyncTask da un'altra classe
- 16. Quanti dati posso inviare tramite un socket.emit?
- 17. Come posso inviare un SMS da Java?
- 18. Node.js - Come inviare i dati da HTML a esprimere
- 19. Come riprodurre AsyncTask da Android in Java codice puro
- 20. Come inviare i dati a ASP.NET HttpHandler?
- 21. Come posso inviare dati asincroni tramite libwebsocket?
- 22. Utilizzando AsyncTask per inviare email Android
- 23. AysncTask si annulla ancora chiamate onPostExecute()
- 24. Come analizzare i dati provenienti da 2 diversi URL con il metodo AsyncTask
- 25. Come inviare dati da un frammento ad un altro frammento?
- 26. Impossibile eseguire l'override del metodo onPostExecute() in AsyncTask Class o ottenerlo per l'attivazione
- 27. Come posso recuperare i dati da AsyncTasks doInBackground()?
- 28. Restituire un array [] da AsyncTask all'attività principale
- 29. Come posso inviare un segnale da un programma python?
- 30. Come posso inviare i parametri a Stimulsoft?
Grazie per la risposta. Non sono un fan di AsyncTask utilizzato come sottoclasse. Penso che dovresti essere in grado di usare gli eventi. Penso che la risposta stia usando intenti ma creerò solo una nuova istanza della mia attività che non desidero. – skinnybrit51
È possibile utilizzare facilmente AsyncTask nella propria classe, ma è utile solo se si utilizza la stessa logica da più attività diverse. In tal caso è possibile: 1. utilizzare una classe di base comune (non un'attività ma qualcosa che si estende attività) e quindi avresti un metodo comune che potrebbe essere chiamato dal task asincrono. O meglio ancora, entrambi hanno implementato un'interfaccia comune che ha il callback come ho descritto. Passa un riferimento all'attività nel costruttore di AsyncTask e assicurati che asyncTask abbia un costruttore che accetta un parametro del tipo di interfaccia. –
L'ultima opzione è quella di abbandonare completamente AsyncTask e inserirlo in un servizio che è necessario creare un nuovo thread per eseguire l'attività in background (poiché i servizi non verranno eseguiti in proprio thread per impostazione predefinita). Un modo semplice per farlo è creare un IntentService che crei un nuovo thread per te. –