First: You directly modify the activity's attribute 'items' (that serves as your data in your list-adapter) in your background thread, without any proper synchronization with the main GUI-thread. This is bad news. It may work for a while, but it's bound to fail at some point.
Second (and i assume that you're using notifyDataSetChanged instead of invalidateViews now): In your third example (and in lesser degree in the second example), you update (sort) your list of 'items' in a tight loop (while (! isCancelled()) {...}). I don't understand why you want to do this. If the phone is fast, the users of your app won't see the sorting happening. It will all be too fast. You should add a sleep-statement to be able to show the sort-result. Also, because it's in a tight loop, your background thread takes waaay too many CPU cycles. Again, put in a sleep (and maybe even lower the thread's priority). Third: How do you do a 'return null' on a method that is declared to return nothing (void)? On Jul 14, 1:15 am, 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 = { "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 --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---