Hi Romain,

I am actually using in List3 adapter.notifyDatasetChanged(). This do
not freeze the app but do not allow the user to scroll perfectly as in
List1. For some reason (the amount of operations probably in the
AsyncTask) the ListView is not entirely independent from the data set
affecting the user's interaction.

Any comment about why this happens ?

Pablo

On 14 jul, 02:21, Romain Guy <romain...@google.com> wrote:
> Do NOT call invalidateViews(), it calls ListView to throw everything
> away. Use Adapter.notifyDatasetChanged() instead.
>
> On Mon, Jul 13, 2009 at 10:15 PM,pperotti<pablo.pero...@gmail.com> wrote:
>
> > Hi Everyone,
>
> > After digging with the APIs I still cannot figure out how the
> > AsyncTask properly works and why some behavior occur.
>
> > I'm trying  to achieve one contact list that can be updated from a
> > background async task very frequently. There are situations where
> > invoking UI updates from the background thread just freeze the UI as
> > you see in example #2. or make the list not to react properly to
> > finger as a regular contact list. Can anyone give me some hint on how
> > to achieve the expected behavior?
>
> > I added here the activities that form my project (sorry for the lenght
> > of the post, my idea was to share the complete problem with everyone)
>
> > Example 1: Contact list without background task. This code contains
> > the behavior of a default contact list. This code produce the expected
> > behavior in responsive for the user but do not update. This activity
> > shows the ideal response for a contact list.
>
> > package com.pp.lists;
>
> > import android.app.ListActivity;
> > import android.content.Intent;
> > import android.hardware.SensorManager;
> > import android.os.Bundle;
> > import android.view.View;
> > import android.widget.ArrayAdapter;
> > import android.widget.Button;
>
> > public class List1 extends ListActivity implements
> > View.OnClickListener {
>
> >    Button btnBack = null;
> >    SensorManager sensorManager = null;
>
> >    String[] items = { "lorem", "ipsum", "dolor", "sit", "amet",
> > "consectetuer", "adipiscing", "elit", "morbi", "vel",
> >            "ligula", "vitae", "arcu", "aliquet", "mollis", "etiam",
> > "vel", "erat", "placerat", "ante", "porttitor",
> >            "sodales", "pellentesque", "augue", "purus", "lorem",
> > "ipsum", "dolor", "sit", "amet", "consectetuer",
> >            "adipiscing", "elit", "morbi", "vel", "ligula", "vitae",
> > "arcu", "aliquet", "mollis", "etiam", "vel",
> >            "erat", "placerat", "ante", "porttitor", "sodales",
> > "pellentesque", "augue", "purus", "lorem", "ipsum",
> >            "dolor", "sit", "amet", "consectetuer", "adipiscing",
> > "elit", "morbi", "vel", "ligula", "vitae", "arcu",
> >            "aliquet", "mollis", "etiam", "vel", "erat", "placerat",
> > "ante", "porttitor", "sodales", "pellentesque",
> >            "augue", "purus", "lorem", "ipsum", "dolor", "sit",
> > "amet", "consectetuer", "adipiscing", "elit", "morbi",
> >            "vel", "ligula", "vitae", "arcu", "aliquet", "mollis",
> > "etiam", "vel", "erat", "placerat", "ante",
> >            "porttitor", "sodales", "pellentesque", "augue",
> > "purus" };
>
> >    /** Called when the activity is first created. */
> >   �...@override
> >    public void onCreate( Bundle savedInstanceState ) {
> >        super.onCreate(savedInstanceState);
> >        setContentView(R.layout.listdemo);
> >        setListAdapter(new ArrayAdapter<String>(this,
> > R.layout.listitem, R.id.label, items));
>
> >        btnBack = (Button) findViewById(R.id.btnBackFromList);
> >        btnBack.setOnClickListener(this);
> >    }
>
> >    public void onClick( View arg0 ) {
> >        if ( btnBack == arg0 ) {
> >            startActivity(new Intent(this, Main.class));
> >        }
> >    }
>
> >    public void onResume() {
> >        System.out.println("List1.onResume!");
> >        super.onResume();
> >    }
>
> >    public void onPause() {
> >        System.out.println("List1.onPause!");
> >        super.onPause();
> >    }
>
> > }
>
> > Example 2: This example update the contact list very frequently
> > properly but without freezing DO NOT allow the user to even scroll.
>
> > package com.pp.lists;
>
> > import android.app.ListActivity;
> > import android.content.Intent;
> > import android.os.AsyncTask;
> > import android.os.Bundle;
> > import android.os.Handler;
> > import android.view.View;
> > import android.widget.ArrayAdapter;
> > import android.widget.Button;
> > import android.widget.EditText;
> > import android.widget.ListView;
>
> > public class List2 extends ListActivity implements
> > View.OnClickListener {
>
> >    Button btnBack = null;
> >    Handler handler = new Handler();
>
> >    String[] items = { "lorem", "ipsum", "dolor", "sit", "amet",
> > "consectetuer", "adipiscing", "elit", "morbi", "vel",
> >            "ligula", "vitae", "arcu", "aliquet", "mollis", "etiam",
> > "vel", "erat", "placerat", "ante", "porttitor",
> >            "sodales", "pellentesque", "augue", "purus", "lorem",
> > "ipsum", "dolor", "sit", "amet", "consectetuer",
> >            "adipiscing", "elit", "morbi", "vel", "ligula", "vitae",
> > "arcu", "aliquet", "mollis", "etiam", "vel",
> >            "erat", "placerat", "ante", "porttitor", "sodales",
> > "pellentesque", "augue", "purus", "lorem", "ipsum",
> >            "dolor", "sit", "amet", "consectetuer", "adipiscing",
> > "elit", "morbi", "vel", "ligula", "vitae", "arcu",
> >            "aliquet", "mollis", "etiam", "vel", "erat", "placerat",
> > "ante", "porttitor", "sodales", "pellentesque",
> >            "augue", "purus", "lorem", "ipsum", "dolor", "sit",
> > "amet", "consectetuer", "adipiscing", "elit", "morbi",
> >            "vel", "ligula", "vitae", "arcu", "aliquet", "mollis",
> > "etiam", "vel", "erat", "placerat", "ante",
> >            "porttitor", "sodales", "pellentesque", "augue",
> > "purus" };
>
> >    private ArrayAdapter adapter = null;
> >    private ListView list = null;
>
> >    BGSorter task = null;
>
> >    EditText txtTest = null;
> >    public boolean isRunning = true;
>
> >    /** Called when the activity is first created. */
> >   �...@override
> >    public void onCreate( Bundle savedInstanceState ) {
> >        super.onCreate(savedInstanceState);
> >        setContentView(R.layout.listdemo);
> >        adapter = new ArrayAdapter<String>(this, R.layout.listitem,
> > R.id.label, items);
> >        setListAdapter(adapter);
>
> >        btnBack = (Button) findViewById(R.id.btnBackFromList);
> >        btnBack.setOnClickListener(this);
>
> >        list = this.getListView();
> >    }
>
> >    public void onClick( View arg0 ) {
> >        if ( btnBack == arg0 ) {
> >            startActivity(new Intent(this, Main.class));
> >        }
> >    }
>
> >    public void onResume() {
>
> >        WorkingObject.status = true;
>
> >        // Start BG job
> >        System.out.println("List2.onResume!");
>
> >        task = new BGSorter();
> >        task.execute();
>
> >        super.onResume();
> >    }
>
> >    public void onPause() {
>
> >        System.out.println("List2.onPause!");
> >        WorkingObject.status = false;
> >        task.cancel(true);
> >        super.onPause();
> >    }
>
> >    class BGSorter extends AsyncTask<Void, String, Void> {
>
> >       �...@override
> >        protected void onProgressUpdate( String... args ) {
> >            try {
> >                System.out.println("OnProgressUpdate=" +
> > Thread.currentThread().getName());
> >                list.invalidateViews();
> >            } catch ( Exception e ) {
> >                System.out.println(e.toString());
> >            }
> >        }
>
> >       �...@override
> >        protected Void doInBackground( Void... arg0 ) {
> >            System.out.println("DoBackground=" + Thread.currentThread
> > ().getName());
>
> >            int random1 = (int) (Math.random() * 10000 % 10); //
> > items.length);
> >            int random2 = (int) (Math.random() * 10000 % 10); //
> > items.length);
>
> >            String temp = items[random1];
> >            items[random1] = items[random2];
> >            items[random2] = temp;
>
> >            publishProgress("random1=" + random1 + " random2=" +
> > random2);
> >            return null;
> >        }
>
> >       �...@override
> >        protected void onPostExecute( Void result ) {
> >            // TODO Auto-generated method stub
> >            super.onPostExecute(result);
>
> >            System.out.println(isCancelled());
>
> >            // Launch another copy of the thread
> >            // if ( isRunning ) {
> >            if ( WorkingObject.status ) {
> >                task = new BGSorter();
> >                task.execute();
> >            }
> >        }
> >    }
>
> >    class Holder {
> >        public int position = 0;
> >    }
>
> >    class UpdateList implements Runnable {
> >       �...@override
> >        public void run() {
> >            System.out.println("UpdateList=" + Thread.currentThread
> > ().getName());
> >            list.invalidateViews();
> >        }
> >    }
> > }
>
> > EXAMPLE 3: Allow the user to interact and scroll but not to 100%
> > accurately. You can see the difference between example 3 and 1 in
> > result. Here, you will see that after start the scrolling with the
> > finger,  the list do not respond properly if you try to stop the
> > scroll as in sample #1. Can anyone give me an idea why?
>
> > package com.pp.lists;
>
> > import android.app.ListActivity;
> > import android.content.Intent;
> > import android.hardware.SensorManager;
> > import android.os.AsyncTask;
> > import android.os.Bundle;
> > import android.os.Handler;
> > import android.view.View;
> > import android.widget.ArrayAdapter;
> > import android.widget.Button;
> > import android.widget.EditText;
> > import android.widget.ListView;
>
> > public class List3 extends ListActivity implements
> > View.OnClickListener {
>
> >    Button btnBack = null;
>
> >    Handler handler = new Handler();
>
> >    String[] items = {
>
> ...
>
> leer más »
--~--~---------~--~----~------------~-------~--~----~
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