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

