我在使用AsyncTask类时遇到了问题。似乎在创建4或5个任务后,我的任务就停止工作了。
我有两个活动,一个是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()
却无法正常工作! - Ali Shakiba