J'essaie d'afficher un ProgressDialog indéfini, alors qu'une AsyncTask se lie à un RemoteService. RemoteService crée une liste des contacts des utilisateurs lors de la création du service. Pour une longue liste de contacts cela peut prendre 5 ~ 10 secondes.ProgressDialog ne s'affiche pas avant la fin de la tâche AsyncTask
Le problème que j'ai, c'est que le ProgressDialog ne s'affiche pas avant que RemoteService ait construit sa liste de contacts. J'ai même essayé de mettre un Thread.sleep pour donner le temps à ProgressDialog d'apparaître. Avec l'instruction sleep, ProgressDialog se charge et commence à tourner, mais se bloque dès que RemoteService commence à faire son travail.
Si je viens de transformer le AsyncTask en code fictif, et que je le laisse simplement dormir pendant un moment, tout fonctionne correctement. Mais quand la tâche doit faire un travail réel, c'est comme si l'interface se trouvait juste et attend.
Des idées sur ce que je fais mal?
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(IM,"Start Me UP!!");
setContentView(R.layout.main);
Log.d(IM, "Building List View for Contacts");
restoreMe();
if (myContacts==null){
myContacts = new ArrayList<Contact>();
this.contactAdapter = new ContactAdapter(this,
R.layout.contactlist,
myContacts);
setListAdapter(this.contactAdapter);
new BindAsync().execute();
}
else{
this.contactAdapter = new ContactAdapter(this,
R.layout.contactlist,
myContacts);
setListAdapter(this.contactAdapter);
}
}
private class BindAsync extends AsyncTask<Void, Void, RemoteServiceConnection>{
@Override
protected void onPreExecute(){
super.onPreExecute();
Log.d(IM,"Showing Dialog");
showDialog(DIALOG_CONTACTS);
}
@Override
protected RemoteServiceConnection doInBackground(Void... v) {
Log.d(IM,"Binding to service in BindAsync");
try{
Thread.sleep(2000);
} catch (InterruptedException e){
}
RemoteServiceConnection myCon;
myCon = new RemoteServiceConnection();
Intent i = new Intent(imandroid.this,MyRemoteService.class);
bindService(i, myCon, Context.BIND_AUTO_CREATE);
startService(i);
Log.d(IM,"Bound to remote service");
return myCon;
}
@Override
protected void onPostExecute(RemoteServiceConnection newConn){
super.onPostExecute(newConn);
Log.d(IM,"Storing remote connection");
conn=newConn;
}
};
EDIT: Ajouté onCreateDialog
protected Dialog onCreateDialog(int id){
switch(id){
case DIALOG_CONTACTS:
ProgressDialog progDialog = new ProgressDialog(imandroid.this);
progDialog.setMessage("Loading Contacts... Please Wait");
progDialog.setCancelable(false);
return progDialog;
default:
return super.onCreateDialog(id);
}
}
Où est le code de onCreateDialog()? – Matthias
Matthias, j'ai ajouté le onCreateDialog – tedwards