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<[email protected]> 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 = { "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() {
>
>        // Start BG job
>        System.out.println("List2.onResume!");
>
>        task = new BGSorter();
>        task.execute();
>
>        super.onResume();
>    }
>
>    public void onPause() {
>
>        System.out.println("List2.onPause!");
>        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 ) {
>
>            while ( !isCancelled() ) {
>                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;
>        }
>
>    }
>
>    class Holder {
>        public int position = 0;
>    }
>
>    class UpdateList implements Runnable {
>       �...@override
>        public void run() {
>            System.out.println("UpdateList=" + Thread.currentThread
> ().getName());
>            adapter.notifyDataSetChanged();
>        }
>    }
> }
>
> Thanks for the time. I'will be more than glad to receive your
> feedback.
> Pablo
> >
>



-- 
Romain Guy
Android framework engineer
[email protected]

Note: please don't send private questions to me, as I don't have time
to provide private support.  All such questions should be posted on
public forums, where I and others can see and answer them

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to