На этот вопрос уже есть ответ:
У меня проблема с классом AsyncTask. Похоже, моя задача перестает работать после создания 4 или 5 задач.
У меня 2 занятия. MainActivity, который содержит только кнопку, запускающую второе действие под названием ImageActivity.
ImageActivity очень прост. он получил onCreate, который устанавливает макет, а затем запускает новую AsyncTask, загружающую изображение из Интернета. Первые несколько раз это работает нормально. Но потом вдруг перестает работать. Каждый раз запускается метод onPreExecute, но не метод doInBackground. Я попытался упростить doInBackground с помощью спящего цикла, и происходит то же самое. Я не могу понять это поведение, поскольку асинтаксическая задача отменена и установлена в значение null в методе onDestroy. Поэтому каждый раз, когда я запускаю новую ImageActivity, я также создаю новую AsyncTask.
Я воссоздаю ImageActivity и задачу, нажимая кнопку «Назад», а затем кнопку на MainActivity.
Есть идеи? Я действительно борюсь с этим.
ОБНОВЛЕНИЕ: Код, запускающий ImageActivity (внутри кнопки onClickListener)
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
intent.setClassName(this, ImageActivity.class.getName());
startActivity(intent);
Приведенный выше код запускает это действие
public class ImageActivity extends Activity {
private AsyncTask task;
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.main);
task = new AsyncTask() {
@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);
}
}
ОБНОВЛЕНИЕ:
Я тестировал с использованием комбинации традиционных Threads и метод runOnUiThread, и вроде работает лучше. Теперь поток запускается каждый раз.