У меня проблема с классом AsyncTask. Кажется, моя задача перестает работать после создания 4 или 5 задач.
Im имеет 2 действия. MainActivity, которая содержит только кнопку, которая запускает второе действие под названием ImageActivity.
ImageActivity очень прост. он получил onCreate, который устанавливает макет, а затем он запускает новую AsyncTask, которая загружает изображение из Интернета. Это работает отлично несколько раз. Но он внезапно перестает работать. Метод onPreExecute запускается каждый раз, но не метод doInBackground. Я попытался упростить doInBackground со спящим циклом, и то же самое происходит. Я не могу понять это поведение, поскольку asynctask отменяется и устанавливается в null в методе onDestroy. Поэтому каждый раз, когда я запускаю новую ImageActivity, я также создаю новую AsyncTask.
Я воссоздал ImageActivity и задачу, нажав кнопку "Назад", а затем нажав кнопку "MainActivity".
Какие-нибудь идеи? Я действительно борюсь с этим.
UPDATE: код, запускающий 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);
}
}
UPDATE:
Я тестировал, используя комбинацию традиционных Threads и runOnUiThread, и, похоже, он работает лучше. Теперь поток запускается каждый раз.