У меня проблема с классом AsyncTask. Кажется, моя задача перестает работать после создания 4 или 5 задач.
У меня 2 мероприятия. MainActivity, который содержит только кнопку, которая запускает второе действие, называемое ImageActivity.
ImageActivity очень проста. у него есть onCreate, который устанавливает макет, а затем он запускает новую AsyncTask, которая загружает изображение из Интернета. Это отлично работает первые несколько раз. Но затем он внезапно перестает работать. Каждый раз запускается метод onPreExecute, но не метод doInBackground. Я попытался упростить doInBackground с помощью спящего цикла, и получилось то же самое. Я не могу понять это поведение, поскольку асинхронная задача и отменена, и в методе onDestroy установлено значение null. Поэтому каждый раз, когда я запускаю новую 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<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);
}
}
ОБНОВИТЬ:
Я тестировал, используя комбинацию традиционных потоков и метода runOnUiThread, и, похоже, он работает лучше. Теперь поток запускается каждый раз.
doInBackground
работает, аLog.d()
внутри не работает! - person Ali Shakiba   schedule 10.10.2012