AsyncTask doInBackground不运行

我遇到了AsyncTask类的问题。 这似乎是我的任务创build4或5个任务后停止工作。

我有2个活动。 MainActivity只保存一个button来启动第二个叫ImageActivity的活动。

ImageActivity非常简单。 它有一个onCreate设置布局,然后它启动一个新的AsyncTask从互联网加载图像。 这工作罚款前几次。 但是,它突然停止工作。 每次运行onPreExecute方法,但不是doInBackground方法。 我试图用睡眠循环简化doInBackground,发生同样的事情。 我无法理解这种行为,因为asynctask在onDestroy方法中都被取消并设置为null。 所以每次我开始一个新的ImageActivity,我也创build一个新的AsyncTask。

我通过点击后退button重新创buildImageActivity和任务,然后单击MainActivity上的button。

任何想法的人? 我真的很苦恼这个。

更新:启动ImageActivity的代码(在onClickListenerbutton内)

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://img.androidcookie.com/android/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); } } 

更新:

我已经testing了使用传统的线程和runOnUiThread方法的组合,并且它似乎更好地工作。 现在线程每次都运行。

Related of "AsyncTask doInBackground不运行"

删除AsyncTask并使用传统的线程,而不是将其与runOnUiThread结合似乎工作。 但是我仍然没有findAsyncTask如此“不稳定”的原因。

以下是适用于我的代码:

 public class ImageActivity extends Activity { private Thread worker; public void onCreate(Bundle bundle) { super.onCreate(bundle); setContentView(R.layout.main); worker = new Thread(new Runnable(){ private void updateUI(final List<Object> list) { if(worker.isInterrupted()){ return; } runOnUiThread(new Runnable(){ @Override public void run() { // Update view and remove loading spinner etc... } }); } private List<Object> download() { // Simulate download SystemClock.sleep(1000); return new ArrayList<Object>(); } @Override public void run() { Log.d(TAG, "Thread run()"); updateUI(download()); } }); worker.start(); } @Override protected void onDestroy() { super.onDestroy(); worker.interrupt(); } } 

我遇到了类似的问题。 在SDK 11之前,您不能有多个并行运行的Asynctasks。请点击这里查看更多信息

我也遇到了这个问题。 如果您使用AsyncTask.execute ,则您的任务将在串行队列(来自Android 4.3源代码)上运行:

首次引入时,AsyncTasks在单个后台线程上被串行执行。 从DONUT开始,将其更改为允许多个任务并行操作的线程池。 从HONEYCOMB开始,任务在单个线程上执行,以避免并行执行导致的常见应用程序错误。

这与我看到的行为是一致的。 我有一个AsyncTaskdoInBackgroundpopup一个对话框,并阻塞,直到closures对话框。 该对话框需要自己的AsyncTask来完成。 对话框的AsyncTask.doInBackground方法从未执行,因为原始的AsyncTask仍然被阻塞。

解决方法是在单独的Executor执行第二个AsyncTask

使用traceview来调查 – 或者获得一个线程转储。 我的猜测是你的一个AsyncTask线程挂在下载。

AsyncTask有一个小的线程池,所以如果你的一个任务挂起,最终可能会阻塞你的线程池。

下面是一个可以运行的快速testing – 4.3,我看到我只能运行5个并发线程。 当一个线程退出时,其他线程启动。

  private void testAsyncTasks() { for (int i = 1; i <= 10; i++) { final int tid = i; new AsyncTask<Integer, Void, Void>() { protected void onPreExecute() { Log.d("ASYNCTASK", "Pre execute for task : " + tid); }; @Override protected Void doInBackground(Integer... args) { int taskid = args[0]; long started = SystemClock.elapsedRealtime(); Log.d("ASYNCTASK", "Executing task: " + taskid + " at " + started); for (int j = 1; j <= 20; j++) { Log.d("ASYNCTASK", " task " + taskid + ", time=" + (SystemClock.elapsedRealtime() - started)); SystemClock.sleep(1000); } return null; } protected void onPostExecute(Void result) { Log.d("ASYNCTASK", "Post execute for task : " + tid); }; }.execute(i); } } 

由于系统pipe理,您不必担心Android中的pipe家线程。

也请张贴图像下载方法。 你是否也尝试不取消onDestroy()方法中的线程? 你如何将图像返回到你的UI线程?

我相信这个问题是随着繁重的图像下载任务。 即使取消asynchronous任务,图像下载也将继续执行,asynchronous任务不会完成,直到下载完成。 您可能需要在下载正在进行时检查AyncTask上的isCancelled()方法,并在任务被取消时终止下载。

作为参考,inheritance人关于cancel()方法的文档: 试图取消这个任务的执行。 如果任务已经完成,已经被取消或者由于其他原因不能被取消,则该尝试将失败。 如果成功,并且此任务在调用取消时尚未开始,则此任务不应运行。 如果任务已经开始,那么mayInterruptIfRunning参数确定执行这个任务的线程是否应该被中断以试图停止任务。 调用此方法将导致在doInBackground(Object [])返回后,在UI线程上调用onCancelled(Object)。 调用这个方法可以保证onPostExecute(Object)永远不会被调用。 调用此方法后,应该定期从doInBackground(Object [])中检查isCancelled()返回的值,以尽早完成任务。

我也有这个,没有真正的起步的理由。 我注意到,重新启动adb后,它再次工作。 不知道这是为什么,但它确实为我工作