9

2つのAsyncTaskがあります。1つはソケット接続を作成し、もう1つはそれらのソケットを使用してオブジェクトを送信します。私のコードはこれです:

try {
        connectat = true;
        transmitter = new SocketTransmitter();
        transmitter.execute();
        connector = new socketConnector();
        connector.execute(owner);

        this.open();
    } catch (IOException e) {

ただし、AsyncTask呼び出されsocketConnectorたものが作成または実行されることはありません。順序を変更しようとしましたが、送信機が作成または実行されません...

それのどこが悪いんだい?

4

5 に答える 5

12

HONEY COMBが複数のAsyncTaskの実行を同時から順次に変更したとき、私はそれを嫌いでした。したがって、AsyncTaskを実行するたびに、次のようなことを行います。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
    task.execute();
}

ただし、スレッドプールのサイズは5です。6番目のタスクを追加すると、キューに追加され、5つのスレッドの1つが終了するまで実行されません。

于 2012-12-01T07:04:43.400 に答える
2

使用しているAPIレベルがわからないので、ASYNCTASKを実行することをお勧めします

ドキュメントによると:

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

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

于 2012-11-30T15:33:13.230 に答える
1

で実行しようとしたことがありますかtransmitterconnector's onPostExecute()またはその逆ですか?

于 2012-11-30T15:15:24.300 に答える
1

AsyncTaskを同時に実行するためのクラスを作成しました。

見てみな:

Android-AsyncTask-エグゼキューター

Android OSのバージョンでAsyncTaskを同時に実行するには、すべての作業が必要です。次のものを使用することをお勧めします。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
    task.execute();
}

AsyncTask.THREAD_POOL_EXECUTORはAPI>=11でのみ使用可能であるため

私のクラスでは、次のように書く必要があります。

AsyncTaskExecutor.executeConcurrently(task, params);

そしてそれがすべてです。Android 2.x、3.x、4.xでエラーは発生しません

于 2012-12-09T13:10:18.833 に答える
0

Robin Chanderが言ったように、それはおそらくシリアルに実行されており、executeOnExecutorを使用できます...しかし、Android3.0まで利用できません。完全な互換性が必要な場合は、をダンプAsyncTaskして使用する必要がありますRunnable。UIスレッドで結果を報告する必要がある場合は、を使用することを忘れないでくださいHandler

于 2012-11-30T16:08:11.017 に答える