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

最初に導入されたとき、AsyncTasksは単一のバックグラウンドスレッドでシリアルに実行されていました。DONUT以降、これはスレッドのプールに変更され、複数のタスクを並行して操作できるようになりました。HONEYCOMB以降、並列実行によって引き起こされる一般的なアプリケーションエラーを回避するために、タスクは単一スレッドで実行されます。

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

API> = 11では、デフォルトで一度に1つだけAsyncTaskが実行されます。

本当に並列実行が必要な場合は、THREAD_POOL_EXECUTORを使用してexecuteOnExecutor(java.util.concurrent.Executor、Object [])を呼び出すことができます。

この問題を解決する1つの方法は、を作成し、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 に答える