AsyncTask chamado do manipulador não executará doInBackground
O aplicativo em que estou trabalhando está usando um thread em segundo plano para baixar uma lista de imagens por meio de uma API e, em seguida, exibir as imagens em uma apresentação de slides.
Existe uma tarefa em segundo plano (atualmente AsyncTask) para buscar periodicamente as novas imagens.
Eu não estou recebendo mensagens de erro sobre o thread errado etc, é apenas que a segunda instância do AsyncTasks não irá executar o método doInBackground.
Aqui está algum código da Atividade:
<code>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); } </code>
oDownloadTask
se parece com isso:
<code>@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); } </code>
O handler será chamado, o onPreExecute (no AsyncTask) será chamado e a execução inicial do DownloadTask (emonCreate
) também funciona.
De acordo com esta pergunta:Android SDK AsyncTask doInBackground não está em execução (subclasse) , pode ser relacionado ao SDK15.
Obrigado por qualquer sugestão.
Atualizar Ao receber comentários, o Manipulador pode não estar no thread da interface do usuário (o que é estranho,Thread.currentThread
é o mesmo tanto no onCreate como nos HandlershandleMessage
método, eu revisei ohandleMessage
método para:
<code>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); } }); } }; </code>
Ainda sem sucesso.
Atualizar a classe completa do DownloadTask
<code>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); } } </code>