2013-03-01 9 views
46

私はAndroidでインターネット接続を読んでいて、これを処理するさまざまな方法、つまりAsyncTaskとIntentServiceがあることに気づいています。しかし、私はどちらを使うべきかまだ分かりません。私のアプリケーションは、基本的にGoogle Mapsを使った場所/歩道のファインダーです。私のインターネット接続は、マップの特定の半径内で最も近い軌跡を見つけるために使用されます。したがって、ユーザーが地図を新しい場所に移動またはスワイプするたびに、それは最も近いトレイルで更新されます。また、新しいトレイルを追加し、ユーザーがトレイルを評価できるようにします。アプリケーションにAsyncTaskまたはIntentServiceを使用する必要がありますか?

AsyncTaskで十分ですか、またはIntentServiceを使用する必要がありますか?

答えて

44

現在実行しようとしているようなアクティビティに緊密にバインドされている短い繰り返しタスクには、AsyncTaskを使用する必要があります。 IntentServiceは、あなたの活動とは独立して、バックグラウンドで実行する予定のタスク(反復的であるかどうか)に合わせて調整されています。

+0

ありがとうございます。 IntentServiceを使用するタスクの例を教えてもらえますか? –

+3

アプリ上の特定の地域の歩道を保存しているとします(「お気に入り」など)。最新の状態にしたい場合は、毎日実行する 'IntentService'を設定し、それらの地域の変更をチェックしてください。 – ebarrenechea

+0

ああ、そうだ。だから、それは私たちの携帯電話のFacebookやGmailの通知のようなものだと思いますか? –

52

これらは、さまざまな目的で非常に異なって使用できます。

AsyncTaskは、ユーザーに常に何かを伝えたり、定期的にメインスレッドの操作を行う必要がある場合に使用できる便利なスレッドユーティリティです。ファイングレイン制御が多く、Activityで動作するのは非常に簡単であるため、IntentServiceは、一般にBroadcastReceiverまたはIBinderフレームワークを使用する必要があります。

IntentServiceは、AsyncTaskと非常によく似ていますが、バックグラウンドのダウンロード、アップロード、その他のユーザー操作やメインスレッドを必要としないブロック操作を目的としています。たとえば、マップをダウンロードしてキャッシュする場合は、IntentServiceに電話して、ダウンロードするアプリをユーザーが見ている必要がないようにすることができます。同様に、サーバーにデータを送信している場合は、IntentServiceがこの点で非常に役立ちます。なぜなら、開始して忘れることができるからです。ユーザーは、アプリにコメントを入力してから「送信」を押すことができます。 「送信」は、IntentServiceを起動し、コメントを取得してバックグラウンドスレッドでサーバーに送信します。ユーザーは「送信」を押してアプリをすぐに離れることができ、コメントは最終的にはサーバーに到達します(もちろんエラーはないものとします)。一方でのAsyncTaskでこれを行った場合、システムは交換の途中でプロセスを停止させる可能性があり、処理が進まない場合があります。

一般に、いずれも長時間実行するアプリケーション向けではありません。彼らは短く、一度だけの操作を意味します。彼らは永続的な、または長期的な行動のために使用することができますが、推奨されていません。

+3

長時間実行される操作には何を使用する必要がありますか? – roiberg

+2

一般的なJavaスレッドがブロックしている場合。必要に応じてアクティビティやサービスに入れることができます。ライフサイクルメソッドを使用してライフサイクルを制御して、想定されていないときにライフサイクルメソッドが実行されないようにします。 – DeeV

+0

-1: '... IntentServiceは一般的にBroadcastReceiverフレームワークを操作する必要があります。 'いいえ、そうではありません。 @Joe Malinの答えをご覧ください:http://stackoverflow.com/a/15168625/109941? –

6

上記のようにAsyncTaskは問題を解決します。

しかし、AsyncTaskには重要な弱点があります。これは、「リフレッシュ」(たとえば回転中)のActivity をうまく処理しないことに注意してください。 AsyncTaskがまだ読み込まれている間に、ユーザーが電話を回すなどの問題が発生する可能性があります。これがあなたのために実際に問題がある場合、私はAsyncTaskLoaderをお勧めします。

http://developer.android.com/reference/android/content/AsyncTaskLoader.html

+0

ヘッドアップありがとう –

21

AsyncTaskは、構成の変更や活動を再開し、他のものとうまく再生されません。

IntentServiceは、作業に要する時間に関係なく、常に利用可能なものに適しています。 AsyncTaskはActivityの状態に非常に依存しているため、ほとんどの場合IntentServiceが優先されます。

いくつかの注意:

  • AsyncTaskはすぐに戻ってUIに行く必要がありますが、それはさまざまな状況で使用することができ、迅速なタスクのための最高です。
  • 「メインスレッドで定期的に操作を実行する」というステートメントは曖昧です。 AsyncTaskは、がメインスレッドであるとは異なる新しいバックグラウンドスレッドを生成し、その新しいスレッドでその作業を行います。したがって、AsyncTaskという名前。
  • IntentServiceでは、BroadcastReceiverフレームワークを「操作する」必要はありません。あなたがする必要があることは、地元の放送意図を送信し、あなたの活動でそれを検出することだけです。これがAsyncTaskよりも難しいかどうかはわかりません。
  • IntentService は、バックグラウンドで実行する長時間実行されるタスクを行うことを目的としたです。
  • AsyncTaskLoaderは使用しても問題ありませんが、CursorLoaderなどの基本クラスを意図しています。 ユーザーが新しい場所に移動したときに「近く」のコースを更新したい場合は、おそらくIntentServiceが良いでしょう。

ロケーションを更新する前に接続を確認することを忘れないでください。

-1

インテントサービスについて一部の点では、一部のデータをサーバにアップロードしたり、サーバからデータベースにデータを保存したりするような、アクティビティと緊密に結合していないタスクに使用する必要があります。@DeVと@ebarrenecheaに同意します。

Android 3.0からは、Loaders APIが導入されました。これは、AsyncTaskの代わりに使用されます。たとえば、Activityに表示するべきローディングリストの場合は、すべての設定変更とActivity Life-Cycleをうまく処理するように設計されたLoaderを使用する方が良いでしょう。

Vogella loader tutorial

+0

サーバ作業にローダーを使用するべきですか?私はこれまでにそれを聞いたことがないし、それにリンクしているドキュメントやチュートリアルでは何も表示されませんでした。 –

8

AsyncTasksは非常に緊密にActivitysにバインドされている、あなたは離れてAsyncTaskを作成した活動から移動すると、多くの場合、漏れたウィンドウのエラーを引き起こす可能性があります。しかし進行状況のパーセンテージをすばやく更新できるので、ProgressBarを表示するのに最適です。

インテントサービスはよりクリーンで安全です。彼らは初心者のAndroid開発者の方が実装が難しいですが、それらを起動して処理する方法を学ぶと、おそらくAsyncTasksに戻ることはありません!

IntentServicesを使用すると、アプリでモジュール式のデザインを使用することもできます。私は通常、すべての私のIntentServicesのための別のクラスを作成しますが、AsyncTasksの場合、アクティビティの内部クラスとして作成します。アクティビティからAsyncTaskを分離する場合は、AsyncTaskコンストラクタ内のアクティビティコンテキストとビューオブジェクトを渡す必要があります。これは面倒です。

+0

問題を克服するために、AsyncTaskクラスに内部インターフェイスを追加できませんでした。インタフェースには、アクティビティが実装するコールバックメソッドが含まれていますか? –

関連する問題