AsyncTask appelé par Handler n'exécutera pas doInBackground
L'application que je suis en train de travailler sur est à l'aide d'un thread d'arrière-plan pour télécharger une liste d'images à travers une API, puis afficher les images dans un diaporama.
Il y a une tâche d'arrière-plan (actuellement AsyncTask) périodiquement chercher de nouvelles images.
Je ne reçois pas tous les messages d'erreur sur le Fil mal, etc, c'est juste que le AsyncTasks deuxième instance ne sera pas exécuter la méthode doInBackground.
Voici un peu de code à partir de l'Activité:
private DownloadTask mDownloadTask = null;
private Handler mHandler;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if(mDownloadTask != null) {
mDownloadTask.cancel(true);
}
mDownloadTask = new DownloadTask();
mDownloadTask.execute((Void[]) null);
}
};
mDownloadTask = new DownloadTask();
mDownloadTask.execute((Void[]) null);
}
La DownloadTask
ressemble à ceci:
@Override
protected List<String> doInBackground(Void... voids) {
//Download list of URLs from server, etc.
}
@Override
protected void onPostExecute(List<String> urls) {
mHandler.sendEmptyMessageDelayed(111, 5000);
}
Le gestionnaire sera appelé, le onPreExecute (dans l'AsyncTask) sera appelée et de l'exécution initiale de DownloadTask (à droite sur la onCreate
) fonctionne aussi.
Conformément à cette question: Android SDK AsyncTask doInBackground pas en cours d'exécution (sous-classe) , il pourrait être SDK15 liés.
Merci pour tous les conseils.
Mise à jour Que j'ai reçu de commentaires que le Gestionnaire pourrait ne pas être dans le thread d'INTERFACE utilisateur (ce qui est bizarre, comme Thread.currentThread
est le même à la fois dans onCreate et les Gestionnaires handleMessage
méthode, j'ai revu le handleMessage
méthode:
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
runOnUiThread(new Runnable() {
@Override
public void run() {
if(mDownloadTask != null) {
mDownloadTask.cancel(true);
}
mDownloadTask = new DownloadTask();
mDownloadTask.execute((Void[]) null);
}
});
}
};
Toujours sans succès.
Mise à jour la pleine DownloadTask classe
class DownloadTask extends AsyncTask<Void, Void, List<String>> {
@Override
protected void onPreExecute() {
//Cancel the animation.
if (mSlideshowAnimation != null) {
mSlideshowAnimation.cancel(true);
}
mImageView1.setVisibility(View.GONE);
mImageView2.setVisibility(View.GONE);
animate(mProgressBar).alpha(1.0f).setDuration(500).start();
Log.d(TAG, "Download preparation done.");
}
@Override
protected List<String> doInBackground(Void... voids) {
Log.d(TAG, "Download");
SharedPreferences s = getSharedPreferences("access", Context.MODE_PRIVATE);
String token = s.getString("token", null);
Log.d(TAG, "Downloading slideshows.");
List<String> urls = new ArrayList<String>();
Slideshow[] slideshows = new Api(SlideshowActivity.this).getSlideshows(token);
for (Slideshow slideshow : slideshows) {
urls.addAll(slideshow.getAllPhotoUrls());
}
Log.d(TAG, "Downloading slideshows: " + slideshows.length);
for (String url : urls) {
try {
url = Api.HOST + url;
if (!Cache.fileExists(Cache.getCacheFilenameForUrl(SlideshowActivity.this, url))) {
Cache.cacheStream(SlideshowActivity.this, HttpHelper.download(SlideshowActivity.this, url), url);
} else {
Log.d(TAG, "Cached: " + url);
}
} catch (IOException e) {
Log.e(TAG, "Error while downloading.", e);
}
}
Log.d(TAG, "Downloading slideshows finished.");
return urls;
}
@Override
protected void onPostExecute(List<String> urls) {
Log.d(TAG, "download successful");
animate(mProgressBar).alpha(0.0f).setDuration(500).start();
mCurrentImageIndex = -1;
mImageUrls = urls;
mSlideshowAnimation = new SlideshowAnimation();
mSlideshowAnimation.execute((Void[]) null);
mHandler.sendEmptyMessageDelayed(111, 5000);
}
}
source d'informationauteur Sebastian Roth
Vous devez vous connecter pour publier un commentaire.
Grâce à une discussion utile avec Waqas (merci!!) J'ai enfin découvert l'erreur dans mon code. En fait, tous les écrits ci-dessus est correcte et fonctionne comme est. Problème avec mon cas était que la deuxième tâche bloqué à la première, et vice versa.
C'était peut-être une coïncidence de trouver ce post sur Google Groupes: http://groups.google.com/group/android-developers/browse_thread/thread/f0cd114c57ceefe3?tvc=2&q=AsyncTask+in+Android+4.0 . Recommande que toutes les personnes impliquées dans le filetage lit cette discussion avec soin.
AsyncTask changé le modèle de thread pour une série d'exécuteur testamentaire (encore une fois), ce qui n'est pas compatible avec mon approche d'avoir 2 AsyncTasks il me semble.
Enfin je suis passé de la manipulation de la "Télécharger" à un classique de la
Thread
et utilisé leHandler
de poster des messages pour annuler le Diaporama, si nécessaire. En utilisant les Gestionnaires desendEmptyMessageDelayed
je vais simple de recréer le Thread de Téléchargement après un certain temps pour actualiser les données.Merci pour tous les commentaires & réponses.
Handler
est une sorte de fil android, et AsyncTask fonctionne aussi dans l'autre thread. Lorsque vous utilisez AsyncTask il y a quelques règles..Donc il est clairement dit AsyncTAsk doit être appelée à partir de l'UI thread.. où comme vous l'appelez de Gestionnaire qui n'est pas un thread d'INTERFACE utilisateur...
bien essayer cela aussi
et aussi la documentation dit cela..