You might look at the following discussion:
http://groups.google.com/group/android-developers/browse_thread/thread/4eb77125b23eb707/a95055a971fb032c

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 the getLastNonConfigurationInstance() to recover the ArrayList's
>> >> > state.
>>
>> >> > Now, my problem...
>>
>> >> > If I rotate from portrait to lanscape when the download is terminated
>> >> > and I see the data in portrait yet, everything is ok.
>> >> > If I rotate during progress dialog is showing I have two cases:
>>
>> >> > 1-  onRetainNonConfigurationInstance() saves the arraylist fully
>> >> > recovered, the thread terminates and everything is ok.
>> >> > 2-  onRetainNonConfigurationInstance() saves the arraylist empty, i
>> >> > think the download isn't finished yet.
>> >> > The onCreate is called and my list is empty, the thread terminates,
>> >> > but i don't see anything in my list.
>>
>> >> > ... if I am in this case and I still rotate from landscape to portrait
>> >> > now I can see my list full with all the data.
>>
>> >> > Why?? Where am I wrong?
>>
>> >> > p.s. sorry for my english, I hope everything is clear.
>>
>> >> > --
>> >> > 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
>>
>> > --
>> > You received this message because you are subscribed to the Google
>> > Groups "Android Developers" group.
>> > To post to...
>>
>> 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

-- 
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