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

Reply via email to