Je vais avoir un problème avec la classe AsyncTask. Il semble que ma tâche s'arrête de fonctionner après la création de 4 ou 5 tâches.
Je vais avoir 2 activités. MainActivity qui ne détient qu'un bouton qui lance une deuxième activité est appelée ImageActivity.
ImageActivity est très simple. il a obtenu un onCreate qui définit la mise en page, et puis il commence une nouvelle AsyncTask qui charge une image à partir d'internet. Cela fonctionne bien pour les premières fois. Mais qu'il s'arrête soudainement de fonctionner. Le onPreExecute méthode est exécutée à chaque fois, mais pas la méthode doInBackground. J'ai essayé de simplifier le doInBackground avec un couchage de boucle, et la même chose arrive. Je ne peux pas comprendre ce comportements depuis l'asynctask est à la fois annulée et la valeur null dans la méthode onDestroy. Donc, à chaque fois que je commence un nouveau ImageActivity, j'ai aussi créer une nouvelle AsyncTask.
Je recrée le ImageActivity et les tâches en appuyant sur le bouton de retour, et qu'en cliquant sur le bouton sur le MainActivity.
Toutes les idées de quelqu'un? J'ai vraiment du mal avec celui-ci.
Mise à JOUR: le Code qui commence le ImageActivity (à l'intérieur d'un bouton onClickListener)
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
intent.setClassName(this, ImageActivity.class.getName());
startActivity(intent);
Le code ci-dessus court à cette activité
public class ImageActivity extends Activity {
private AsyncTask<Void, Void, Void> task;
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.main);
task = new AsyncTask<Void, Void, Void>() {
@Override
protected void onPreExecute()
{
Log.d(TAG, "onPreExecute()");
}
@Override
protected Void doInBackground(Void... params)
{
Log.d(TAG, "doInBackground() -- Here is the download");
// downloadBitmap("http://mydomain.com/image.jpg")
return null;
}
@Override
protected void onPostExecute(Void res)
{
Log.d(TAG, "onPostExecute()");
if(isCancelled()){
return;
}
}
}.execute();
}
@Override
protected void onDestroy()
{
super.onDestroy();
task.cancel(true);
}
}
Mise à JOUR:
J'ai testé à l'aide d'une combinaison de traditionnelle Fils et runOnUiThread méthode, et il semble fonctionner mieux. Maintenant le thread s'exécute à chaque fois.