![](/img/trans.png)
[英]Android: Changing targetSdkVersion from 15 to 18 effects the layout view
[英]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.