繁体   English   中英

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

[英]AsyncTask stopped working when android:targetSdkVersion was changed from 9 to 15

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

首次引入时,AsyncTasks在单个后台线程上串行执行。 从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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM