AsyncTask doInBackground不运行

Vid*_*nes 34 android android-asynctask

我遇到了AsyncTask类的问题.在创建4个或5个任务后,我的任务似乎停止了.

我有2个活动.MainActivity只包含一个按钮,用于启动名为ImageActivity的第二个活动.

ImageActivity非常简单.它有一个onCreate设置布局,然后它启动一个新的AsyncTask,从Internet加载图像.这在前几次工作正常.但它突然停止工作.每次运行onPreExecute方法,但不运行doInBackground方法.我试图用睡眠循环简化doInBackground,同样的事情发生了.我无法理解这种行为,因为asynctask在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);
Run Code Online (Sandbox Code Playgroud)

上面的代码开始此活动

    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);
    }
}
Run Code Online (Sandbox Code Playgroud)

更新:

我已经使用传统Threads和runOnUiThread方法的组合进行了测试,似乎效果更好.现在线程每次运行.

Vid*_*nes 24

删除AsyncTask并使用传统的Thread而不是将它与runOnUiThread结合起来似乎可行.但我还没有找到AsyncTask如此"不稳定"的原因.

这是适合我的代码:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这揭示了为什么AsyncTask可能让你失败了(还有我!):http://foo.jasonhudgins.com/2010/05/limitations-of-asynctask.html (5认同)

小智 7

我遇到了类似的问题.在SDK 11之前,您无法并行运行多个Asynctasks.有关详细信息,请单击此处


Hea*_*ers 6

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

首次引入时,AsyncTasks在单个后台线程上串行执行.从DONUT开始,这被改为一个线程池,允许多个任务并行运行.从HONEYCOMB开始,任务在单个线程上执行,以避免由并行执行引起的常见应用程序错误.

这与我所看到的行为一致.我AsyncTask弹出一个对话框doInBackground并阻止,直到对话框关闭.该对话框需要自己AsyncTask完成.对话框的AsyncTask.doInBackground方法从未执行,因为原始文件AsyncTask仍然被阻止.

解决方案是AsyncTask单独执行第二个Executor.