2

私はAndroidで次の問題を抱えています:

行でいくつかの非同期タスクを処理する必要があります(e.g. Async-Task 1 -> Async-Task 2 -> Asyc-Task 3)。すべてのasync-tasksはハンドラーで応答してい(sendMessage(xy))ます。

したがって、私のハンドラーは次の非同期タスクを開始する必要があります。これはベストプラクティスですか?私は別の方法を好むべきですか?

要約:私は多くの非同期タスクを連続して処理する方法を探しています...

asyncThreadのget()関数は、ハンドラーでのみ回答を返すため、使用できません。

私の悪い英語でごめんなさい。

4

4 に答える 4

2

他の両方の答えがあなたがそれを連続してやりたいという事実を見逃していたのはおかしいです...:)

個人的にはAsyncTaskが嫌いで、自分のスレッドでこれを実装したいのですが、それは私です。

アクションA(および完了したら)がアクションB(など)を呼び出すようにします...これは、BLアクションのシーケンスを実行するために実際には単一のスレッドが必要であることを意味します。

これは、2つのハンドラーを持つオブジェクトによって簡単に実現できます。1つはBL用の新しいThreadHandlerのハンドラーで、もう1つはおそらくUI更新用のUIスレッドハンドラーです。タスクが完了すると、BLハンドラーに投稿して次のタスクを開始します。 。

これにより、プロセス全体がカプセル化され、バグの追跡が容易になります。複数のサーバーとSMS検証コード、およびその他のいくつかのログインフローについて、このモデリングを2回実行しました。

また、タスクの成功または失敗の結果で、さまざまなタスクを呼び出す必要があるシナリオについても説明します。

于 2013-03-25T22:26:52.513 に答える
1

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

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

AsyncTaskは、ThreadPoolExecutorで作成されたスレッドプールを管理します。5から128のスレッドがあります。スレッドが5つを超える場合、それらの余分なスレッドは、削除される前に最大10秒間留まります。(注:これらの数値は、現在表示されているオープンソースコードのものであり、Androidのリリースによって異なります)(同様の質問に対するコモンウェアによる回答)

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

http://developer.android.com/reference/java/util/concurrent/Executor.html。エグゼキュータの使用を検討してください。

RoboSpiceの使用を検討することもできます。https://github.com/octo-online/robospice 複数のspicerequestを作成することもできます。

于 2013-03-25T21:59:10.703 に答える
1

オットーとテープ(スクエア製)の組み合わせをお勧めします。

キューを使用してサーバーに画像をアップロードするサンプルを見ることができます。

https://github.com/square/tape/tree/master/tape-sample/src/main/java/com/squareup/tape/sample

于 2013-03-25T23:22:03.190 に答える
0

これらすべてのタスクを同時に実行する必要がある場合は、実際には複数の非同期タスクを起動する以外に選択肢はありません。ただし、これらすべてのタスクをバックグラウンドで実行する必要がある場合は、おそらく1つの非同期タスクを起動し、他のタスクを実行するためのパラメーターを指定することができます。

Loadersの代わりに使用することを検討することをお勧めしAsyncTasksます。Loaders非同期で実行され、私の意見では、コードで管理する方が簡単です。onLoaderFinishedローダーがメソッドの実行を終了したときにローダーを使用するActivityと、ローダーのコールバックを実装でき、onCreateLoader複数のローダーを処理できるため、を使用するよりもはるかに簡単ですAsyncTaskこれがローダーのチュートリアルです。

于 2013-03-25T21:56:20.067 に答える