O AsyncTask doInBackground não é executado [duplicado]
Esta pergunta já tem uma resposta aqui:
O SDK do Android AsyncTask doInBackground não está em execução (subclasse) 9 respostasEstou tendo um problema com a classe AsyncTask. Parece que minha tarefa para de funcionar depois de criar 4 ou 5 tarefas.
Estou tendo 2 atividades. MainActivity, que contém apenas um botão que inicia uma segunda atividade chamada ImageActivity.
ImageActivity é muito simples. ele recebeu um onCreate que define o layout e inicia um novo AsyncTask que carrega uma imagem da Internet. Isso funciona bem nas primeiras vezes. Mas, de repente, ele para de funcionar. O método onPreExecute é executado sempre, mas não o método doInBackground. Eu tentei simplificar o doInBackground com um loop adormecido, e a mesma coisa acontece. Não consigo entender esse comportamento, pois a asynctask é cancelada e definida como nula no método onDestroy. Portanto, toda vez que inicio uma nova ImageActivity, também crio uma nova AsyncTask.
Recrio a ImageActivity e a tarefa pressionando o botão Voltar e, em seguida, clicando no botão na MainActivity.
Alguma idéia para alguém? Estou realmente lutando com este.
UPDATE: código que inicia o ImageActivity (dentro de um botão noClickListener)
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
intent.setClassName(this, ImageActivity.class.getName());
startActivity(intent);
O código acima inicia esta atividade
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);
}
}
ATUALIZAR:
Eu testei usando uma combinação de Threads tradicionais e o método runOnUiThread, e parece funcionar melhor. Agora o thread é executado sempre.