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