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