Un mesetto fa avevo già aperto un topic simile riguardo alla gestione della rotazione.
Quello che so sulla rotazione l'ho appreso da questo LINK, molto utile e da consigliarsi sicuramente per chi vuole utilizzare questa feature.
Nel mio caso ho una app che ha una ListActivity come activty principale.
Questa lista è popolata con dei dati che recupero sulla rete da un file XML.
La lista non è altro che un ArrayList<T> di oggetti ottenuti parsando il file XML con SAXparser.
La mia app mostra una ProgressDialog mentre il thread in background svolge questo lavoro (scarica, parsa e riempio il mio ArrayList). Quando il thread termina invia un "segnale" (Handler messi a disposizione dall'OS) all'activity principale che popola la ListView, così so quando interrompere la ProgressDialog e visualizzare la ListView. Fino a qui tutto ok
I problemi li ho incontrati con la rotazione... io ho adottato il metodo proposto nella PART TWO del tutorial che ho linkato prima, ossia utilizzo onRetainNonConfigurationInstance(), per salvare lo stato del mio ArrayList al momento della rotazione per poir creare la nuova actiivty da questo, perchè la rotazione distrugge l'activity con onDestroy e ne ricrea un'altra con onCreate().
Se passo da portrait a landscape con la mia lista già riempita e visibile a video, tutto funziona alla grande.
Se invece la rotazione viene fatta durante il download, quindi con la progress dialog attivata, ho dei problemi... mi capitano sempre due casi.
Premetto che la progressDialog la chiudo manualmente quando viene fatta la onDestroy della activity, quindi quando catturerò l'handler semplicemente verrà ignorato, perchè troverà la progressdialog già chiusa.
veniamo ai due casi che vi dicevo:
caso 1: apro il tastierino con la progress dialog attiva. Il tutto sembra funzionare bene, la rotazione funziona. La onRetainNonConfigurationInstance() mi salva l'ArrayList che il thread a riempito, dal Log vedo che è effettivamente pieno, e va tutto ok.
caso 2: se sono veloce e apro il tastierino appena un istante prima che la ProgressDialog appaia o quasi "in contemporanea", avviene la rotazione in landscape senza nessun crash, quindi viene creata la nuova activity ma la lista appare vuota. Se chiudo il tastierino e riporto tutto in portrait, magicamente la lista appare piena e viene visualizzata. Ovviamente c'è qualcosa che non torna... boh?!
Dai Log (sempre del caso 2), risulta che: la onRetainNonConfigurationInstance() salva l'ArrayList vuoto, evidentemente sono stato così veloce che il thread non lo ha ancora riempito, il che mi fa pensare che venga visualizzata vuota per questo motiv, ma il thread continua in background lo stesso... teoricamente anche se la progress dialog è stata chiusa nella onDestroy(), l'handler mi arriva lo stesso per segnalarmi che il thread ha finito, è a questo punto che io popolo la listaview con i dati presenti nell'arrayList, perchè anche se l'ho ripristinata a partire da vuota, mi aspetto che alla fine il thread l'abbia cmq riempita, invece mi appare vuota a schermo.
La cosa strana è come vi ho detto che se da questo punto io ruoto di nuovo e riporto tutto in portrait, il log mi dice che onRetainNonConfigurationInstance() salva una lista piena, (ma allora il thread l'ha riempita per davvero?) e infatti in portrait viene mostrata a video.
Non capisco perchè di questa cosa... se fosse vuota dovrebbe esserlo sempre, o viceversa se fosse piena dovrebbe esserlo sempre.
Spero di essermi riuscito a spiegare, capisco che per certe cose servirebbe il codice, ma vorrei cercare di capire insieme a voi cosa c'è che sbaglio o forse ignoro.![]()