当android:targetSdkVersion从9更改为15时,AsyncTask停止工作

时间:2012-10-04 14:15:29

标签: android android-asynctask

public void OnBtnSendClick(View v)
{
    byte[] bytes = ...;  // array is assigned here

    SendTask task = new SendTask();
    task.execute(new byte[][] {bytes});   // this line is executed
}

private class SendTask extends AsyncTask<byte[], Void, String>
{
    @Override
    protected String doInBackground(byte[]... parameters) 
    {
            Log.i(LOG_TAG, "SendTask.doInBackground started");   // this line is not executed
            return "OK";
    }

    @Override
    protected void onPostExecute(String result) 
    {
            // ...
    }
}

此代码与清单中的android:targetSdkVersion="9"一起使用。我将其更改为android:targetSdkVersion="15",现在SendTask.doInBackground未执行。在调试器中,我看到task.execute行已执行,但永远不会调用doInBackground

顺便说一句,该程序包含另一个成功运行的AsyncTask

1 个答案:

答案 0 :(得分:2)

  

首次引入时,AsyncTasks在单个上串行执行   背景线程。从DONUT开始,这被改成了一个池   允许多个任务并行运行的线程。从...开始   HONEYCOMB,任务在单个线程上执行以避免常见   并行执行导致的应用程序错误。

http://developer.android.com/reference/android/os/AsyncTask.html

On API&gt; = 11默认情况下,一次只执行一个AsyncTask

  

如果您真的想要并行执行,可以调用   executeOnExecutor(java.util.concurrent.Executor,Object [])with   THREAD_POOL_EXECUTOR。

解决此问题的一种方法是创建BaseTask并使所有任务扩展

public class BaseTask extends AsyncTask
{
    ...

    public void fireInTheHole()
    {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
            this.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
        else
            this.execute();
    }

    ...
}

然后,当您需要执行它时,只需拨打myTask.fireInTheHole()而不是myTask.execute()