Come da titolo, come diavolo si gestisce la rotazione dello schermo se nell'activity c'è un AsyncTask in esecuzione?
Il codice della mia activity al momento è il seguente:
1
2private AsyncTask<String, Void, String> loaderTask;
3
4public void onCreate(Bundle savedInstanceState) {
5super.onCreate(savedInstanceState);
6setContentView(R.layout.main);
7
8String url = "http://XXXXXXXXXX"; //UN URL QUALSIASI
9
10loaderTask = (AsyncTask<String, Void, String>)getLastNonConfigurationInstance();
11if(loaderTask == null) {
12loaderTask = new LoaderTask();
13}
14
15// VERIFICO LO STATO DEL TASK
16AsyncTask.Status state = loaderTask.getStatus();
17if(state == AsyncTask.Status.PENDING) {
18loaderTask.execute(url);
19} else if(state == AsyncTask.Status.FINISHED) {
20change(((LoaderTask)loaderTask).result);
21}
22}
23
24
25public Object onRetainNonConfigurationInstance() {
26return loaderTask;
27}
28
29private void change(String file) {
30//qua gestisco il risultato dell'AsyncTask
31//...
32}
33
34private class LoaderTask extends AsyncTask<String, Void, String> {
35public String result;
36
37protected String doInBackground(String... urls) {
38String ret = null;
39
40int count = urls.length;
41for(int i = 0; i < count; i++) {
42//QUA ESEGUO IL TASK E SETTO IL RISULTATO IN RET
43//ret = ...
44}
45return ret;
46}
47
48
49protected void onPostExecute(String result) {
50this.result = result;
51// QUA VIENE CHIAMATO AL TERMINE DEL TASK
52// PER AGGIORNARE LO STATO DELL'ACTIVITY PADRE
53change(result);
54}
55}
56
57
Ho aggiunto la getLastNonConfigurationInstance() e onRetainNonConfigurationInstance() che dovrebbero servire a passare un oggetto da una activity che si sta distruggendo alla successiva che viene creata, ed in effetti dopo la rotazione quando la nuova activity passa dall'onCreate(), l'AsyncTask viene correttamente recuperato e ho potuto verificare che prosegue tranquillamente il lavoro.
Quello che non succede, e qui sta il problema, è che dopo che l'activity viene ricreata, l'AsyncTask quando chiama la sua onPostExecute() non invoca il metodo dell'activity padre, ho come l'impressione che sia ancora legato alla vecchia activity e pertanto l'activity resta sempre in attesa del termine del task!!!
Da notare che se ruoto di nuovo e il task è completato, ho aggiunto nella onCreate un if per verificare lo stato del task e se è già FINISHED, allora recupero il risultato direttamente dall'istanza dell'AsyncTask (altrimenti restava in attesa di una chiamata che ormai il task non farà più).
Qualche idea, suggerimento, consiglio su cosa fare per risolvere?
Grazie