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
。
答案 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()