6

バックグラウンド

AsyncTask よりも推奨される、バックグラウンドでデータをロードするための新しいソリューションがいくつかあると聞きました ( loaders など)

問題

AsyncTasks は素晴らしく、使いやすいです。ただし、いくつかの制限があります。

  1. 保留中のタスクの数 (約 256 程度) によって制限されるため、クラス自体を変更する必要があります。もちろん、listView のアダプターでは、タスクが必要ない場合 (たとえば、別のアイテムに使用されたビューを更新する必要がある場合) は常にタスクをキャンセルします。

  2. また、アクティビティ/フラグメントが再作成されているときに、それらをすべてキャンセルする (または別の方法で処理する) 必要があります。

  3. 1&2のため、それらを管理し、それらすべてを参照する必要があります

  4. AsyncTask はタスクのキューを使用し、代わりにスタックを使用する必要がある場合もあるため、代わりにスタックを使用する独自の AsyncTask クラスを作成する必要がありました。

質問

AsyncTask の代替手段はありますか?

これは以前のいくつかの投稿で尋ねられたことは知っていますが (ここのように)、asyncTask に代わるバックグラウンドでデータをロードする新しい一般的な方法があるかどうかを考えていました。

ローダーについては、データベースと contentProvider に使用されるという考えだと思いますが、(たとえば) インターネットからのデータ (画像ファイルなど) の読み込みにも使用できますか?

また、Google によって作成された素敵なサンプル (ここでは "bitmapFun" と呼ばれます) もあります。これは、AsyncTask を使用していることがわかります (そして、おそらく私が言及したのと同じ理由で、それを拡張することさえあります)。しかし、多分私も何かを見逃していますか?

4

3 に答える 3

2

ビューに応じていくつかの更新を実行し、以前のビューから保留中のすべてのタスクをキャンセルする必要があるため、作成する必要があるすべてのビューに対して個別にデータのロードを実行しているという印象を与えます。 .

リスト アダプターを使用したリスト ビューでは、通常、データの一部 (ValueObject のリストとして、または複数のデータベース行からのカーソルとして) を、アイテムごとではなく、オンデマンドまたは 1 つの目標でページ分割してロードします。したがって、次のページを更新する場合は、基本的に AsyncTask またはローダーを使用して新しいアイテムをモデルにフェッチし、UI でそれらを表示できるようにする 1 つの操作を実行します。このように、MVC を適用すると、キャンセルして制御する保留中のタスクがいくつかなくなり、構造がより強固になり、管理が容易になります。

代替手段について、データベースを扱っている場合、最も簡単な方法は CursorLoader 、つまり AsyncTask の代わりにローダーを使用することです、ネットワークまたはファイルシステムからのデータを扱っている場合は、ちょっと自由です利用可能な他のさまざまなオプションから選択します。AsyncTaskははるかに簡単に使用でき、主に単純なものやワンショット クエリに推奨されます。ただし、そのようなタスクにもローダーを使用できます。 AsyncTaskLoaderを参照してください。

于 2013-03-17T16:51:57.240 に答える
2

はい。

ローダーはマネージド AsyncTasks です。ローダーを使用していない場合は、必要な管理が不足している可能性があります。

AsyncTasks (およびローダー) は、デバイスの外にあるものを取得するためのかなり悪い方法です。リモート サーバーからデータを取得するには、IntentService の使用を検討してください。参照: https://www.youtube.com/watch?v=xHXn3Kg2IQE

于 2013-03-17T16:37:10.587 に答える
1

AsyncTask は、Thread と Handler のヘルパー クラスとして設計されており、一般的なスレッド フレームワークを構成するものではありません。AsyncTasks は、理想的には短い操作 (せいぜい数秒) に使用する必要があります。スレッドを長時間実行し続ける必要がある場合は、次のような java.util.concurrent パッケージで提供されるさまざまな API を使用することを強くお勧めします。 Executor、ThreadPoolExecutor、および FutureTask。詳細については、http://developer.android.com/reference/android/os/AsyncTask.htmlを参照してください。

asynctask の代替は robospice です。https://github.com/octo-online/robospice .

ここで robopice を使い始めることができます。https://github.com/octo-online/robospice/wiki/Starter-Guide .

https://play.google.com/store/apps/details?id=com.octo.android.robospice.motivations&feature=search_resultの robospice のサンプル。

ロボスパイスの特徴の一部。

1.executes asynchronously (in a background AndroidService) network requests (ex: REST requests using Spring Android).

2.is strongly typed ! You make your requests using POJOs and you get POJOs as request results.

3.enforce no constraints neither on POJOs used for requests nor on Activity classes you use in your projects.

4.caches results (in Json with both Jackson and Gson, or Xml, or flat text files, or binary files, even using ORM Lite).

5.notifies your activities (or any other context) of the result of the network request if and only if they are still alive

6.no memory leak at all, like Android Loaders, unlike Android AsyncTasks notifies your activities on their UI Thread.

7.uses a simple but robust exception handling model.
于 2013-03-17T16:40:34.503 に答える