1
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,它正在成功运行。

4

1 回答 1

2

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

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

默认情况下,API >= 11 一次只AsyncTask执行一个。

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

解决此问题的一种方法是创建一个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()

于 2012-10-04T14:21:25.170 回答