yes! this is the solution! Thanks a lot! the problem was the reference to the activity in my handler. It pointed to the old activity so i lost all the modifications to the layout.
On 10 Feb, 23:23, Christoph Renner <chrigi.ren...@gmail.com> wrote: > You might look at the following > discussion:http://groups.google.com/group/android-developers/browse_thread/threa... > > > > On Wed, Feb 10, 2010 at 10:38 PM, Noodles <brand...@gmail.com> wrote: > > You're right... I have forgotten to save the handler's reference. > > Yes, it's strange that it works if i rotate twice the screen... :( > > > I tried this modify, but it doesn't work yet. > > > @Override > > public Object onRetainNonConfigurationInstance() { > > Log.d("DEBUG", "onRetainNonConfigurationInstance() saving > > listaGP"); > > Vector<Object> vect = new Vector<Object>(); > > vect.add(listaGP); //save list > > vect.add(onDownloadFinished); //save handler > > return vect; > > } > > > In this way would I have to be able to save the references of both? > > > On 10 Feb, 20:53, Christoph Renner <chrigi.ren...@gmail.com> wrote: > >> Your reference to the Handler and the ArrayList in ConnectTask no > >> longer point to the fields of the Activity if it is destroyed and > >> recreated. This meens that the the thread cannot update the view > >> properly. I have no idea why it works for you when change the screen > >> rotation twice. > > >> On Wed, Feb 10, 2010 at 11:26 AM, Noodles <brand...@gmail.com> wrote: > >> > Hi Chrigi! Thanks for your answer. > > >> > My thread has a reference to the ListView. > >> > But I'm not sure that this is the reason, maybe it could be... but If > >> > you are right why, when i rotate display for the second times, do i > >> > see the list with data? If i lost the reference to the thread's > >> > listview, i would lose also then. or not? > > >> > I show you a part of my code, maybe it can be usefull to understand > >> > better my problem. > > >> > public class HelloMotoGp extends ListActivity { > > >> > /* > >> > * VARIABILI > >> > */ > >> > protected ArrayList<XMLitem> listaGP = new ArrayList<XMLitem>(); // > >> > creo la lista che conterrà i GP letti da XML > >> > private ProgressDialog dialog=null; > >> > protected Handler onDownloadFinished; > >> > ConnectTask downloadTk; > >> > Thread thread; > > >> > /** Called when the activity is first created. */ > >> > �...@override > >> > public void onCreate(Bundle savedInstanceState) { > >> > super.onCreate(savedInstanceState); > >> > Log.d("DEBUG", "on Create()"); > >> > boolean restoreFlag = restore(); > >> > if(!restoreFlag){ > >> > manageDialog(); > >> > downloadData(); > >> > } > > >> > } > > >> > �...@override > >> > public void onStop(){ > >> > super.onStop(); > >> > Log.d("DEBUG", "onStop()"); > >> > if(dialog!=null && dialog.isShowing()){ > >> > dialog.dismiss(); > >> > Log.d("DEBUG", "dialog dismiss onStop()"); > >> > } > > >> > } > > >> > private void downloadData(){ > > >> > Log.d("DEBUG", "onDownload()"); > >> > //creo il thread associato al task Connect > >> > downloadTk=new ConnectTask(url,listaGP, onDownloadFinished); > >> > thread=new Thread(downloadTk); > >> > thread.start(); > >> > Log.d("DEBUG", "thread started"); > > >> > } > > >> > private void populateList(){ > >> > setListAdapter(new myAdapter(this, listaGP)); //my custom adapter > >> > Log.d("DEBUG", "populateList()"); > >> > } > > >> > �...@override > >> > protected void onListItemClick(ListView l, View v, int position, > >> > long id) { > >> > super.onListItemClick(l, v, position, id); > >> > Intent i = new Intent(this, GaraView.class); > >> > i.putExtra(GaraView.ITEM_LINK, > >> > listaGP.get(position).getDescription()); > >> > startActivity(i); > >> > } > > >> > �...@override > >> > public Object onRetainNonConfigurationInstance() { > >> > Log.d("DEBUG", "onRetainNonConfigurationInstance() saving > >> > listaGP"); > >> > Vector<Object> vect = new Vector<Object>(); > >> > vect.add(listaGP); > >> > return vect; > >> > } > > >> > private boolean restore() { > >> > Vector<Object> obj = > >> > (Vector<Object>)getLastNonConfigurationInstance(); > >> > if(obj!=null){ > >> > listaGP = (ArrayList<XMLitem>) obj.elementAt(0); > >> > //mostro la lista a video se è vuota > >> > if(!listaGP.isEmpty()){ > >> > Log.d("DEBUG", "ListaGP full"); > >> > setContentView(R.layout.main); > >> > populateList(); > >> > return true; > >> > }else{ > >> > Log.d("DEBUG", "ListaGP, empty"); > >> > //mostro la finestra di download in corso > >> > return true; > >> > } > >> > }else > >> > Log.d("DEBUG", "obj NULL"); > >> > return false; > >> > } > > >> > private void manageDialog(){ > >> > //mostro la finestra di download in corso > >> > dialog = ProgressDialog.show(this,"Downloading...", "Updating > >> > Data", true, false); > > >> > //handler utilizzato per determinare se il download è terminato > >> > onDownloadFinished = new Handler(){ > >> > �...@override > >> > public void handleMessage(Message m){ > >> > Log.d("DEBUG", "Handler Captured"); > >> > if(dialog!=null && dialog.isShowing()){ > >> > dialog.dismiss(); > >> > Log.d("DEBUG", "DIALOG was showing now is > >> > DISMISSED"); > >> > } > > >> > if(listaGP.isEmpty()) > >> > Log.d("DEBUG", "the list is empty!!!"); > >> > else{ > >> > //mostro la lista a video > >> > setContentView(R.layout.main); > >> > populateList(); > >> > Log.d("DEBUG", "Show list after Handler"); > >> > } > >> > } > >> > }; > > >> > } > > >> > } > > >> > ***MY RUNNABLE**** > > >> > public class ConnectTask implements Runnable{ > > >> > private String url; //url sorgente xml > >> > private Handler downloadFinished; > >> > private boolean isListDownload; //flag che indica quale download > >> > sto > >> > effettuando > >> > ArrayList<XMLitem> lista; //SD per ListActivity > >> > String [] array; //SD per la GaraVIew Activity > > >> > public ConnectTask(String url, ArrayList<XMLitem> list, Handler > >> > h){ > >> > this.url=url; > >> > this.lista=list; > >> > this.downloadFinished = h; > >> > this.isListDownload = true; > > >> > } > > >> > public void run(){ > > >> > /*** my thread work... ***/ > > >> > //send to the main activity a message to signal the thread has > >> > terminated. This message will be caputerd with an handler in the > >> > activity > >> > Message msg = new Message(); > >> > msg.what = HelloMotoGp.DOWNLOAD_COMPLETED; > >> > this.downloadFinished.sendMessage(msg); > >> > Log.d("DEBUG", "thread termina."); > > >> > } > > >> > } > > >> > On 9 Feb, 11:20, Christoph Renner <chrigi.ren...@gmail.com> wrote: > >> >> Hi Noodles, > > >> >> I guess the problem is the following: your thread has a reference to > >> >> the Activity or ListView. When the download is finished the thread > >> >> uses this reference to add the items to the ListView. However when the > >> >> screen orientation has changed, the activity has been destroyed and > >> >> recreated and the reference points not anymore to the activity (and > >> >> listview) which is displayed. Therefore your adding items (e.g. by > >> >> calling setAdapter) on a listview which is not displayed. > > >> >> Possible solution: > >> >> - Thread has reference to activity (thread.activity) > >> >> - when onRetainNonConfigurationInstance is called set thread.activity > >> >> = null and return a reference to the thread > >> >> - onCreate: if getLastNonConfigurationInstance returns state (not > >> >> null) call state.thread.setActivity(this) > >> >> - whenever your thread wants to access the activity (or the list > >> >> view) it needs to make sure that thread.activity != null, if > >> >> thread.activity == null the action needs to be cached for later > >> >> execution (for example by using a list of runnables) > > >> >> I hope that helps, if something is unclear or you have additional > >> >> questions don't hesitate to ask! > > >> >> Chrigi > > >> >> On Mon, Feb 8, 2010 at 5:39 PM, Noodles <brand...@gmail.com> wrote: > >> >> > I have a problem with rotation, during my ListActivity is loading data > >> >> > from the network. > >> >> > To do it I use a background thread which recovers data and put them > >> >> > inside an ArrayList. While this thread works, there is Progress dialog > >> >> > activated in foreground. > > >> >> > For the rotation I use the method with > >> >> > onRetainNonConfigurationInstance() to save my ArrayList's state. After > >> >> > android calls this method, I call dismiss() on the progress dialog on > >> >> > onStop(). Then the activity is created as new with onCreate(), but it > >> >> > use... > > leggi tutto -- You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en