web-dev-qa-db-ja.com

Service、AsyncTask、またはHandlerをいつ使用するのですか?

誰かが私に[〜#〜] true [〜#〜]違いを教えてもらえますか?

32
TIMEX

私の経験則では、AsyncTaskは、単一のActivityに関連付けられた何かをしたいときのためのものであり、Serviceは、継続する何かをしたいときのためのものです。開始したアクティビティの後、バックグラウンドになります。

したがって、UIを拘束せずにActivityでバックグラウンド処理を少し実行したい場合は、AsyncTaskを使用します。次に、そのHandlerのデフォルトのActivityを使用してメッセージを返し、メインスレッドで更新が行われるようにします。メインスレッドで更新を処理することには、2つの利点があります。UIの更新が正しく行われることと、同期の問題についてそれほど心配する必要がないことです。

たとえば、ダウンロードに時間がかかる可能性がある場合は、Serviceを使用します。したがって、アプリケーションまたは別のアプリケーションで別のActivityに移動した場合、Serviceは実行を継続し、ファイルをダウンロードし続けることができるため、アプリケーションに戻ったときに準備が整います。この場合、ダウンロードが完了したら ステータスバー通知 を使用するので、ユーザーは都合のよいときにいつでもアプリケーションに戻ることができます。

長時間実行されるプロセスにAsyncTaskを使用すると、Activityから移動した後も続行される場合がありますが、次のようになります。

  • 処理が完了したときにActivityがバックグラウンドにある場合、結果などでUIを更新しようとすると問題が発生する可能性があります。
  • バックグラウンドActivityは、Serviceよりもメモリが必要な場合、Androidによって強制終了される可能性がはるかに高くなります。
24
Dave Webb

長期間バックグラウンドで実行する必要があるものがある場合は、Serviceを使用します。それはいかなる活動にも拘束されません。正規の例は音楽プレーヤーです。
AsyncTaskは、現在のアクティビティ中にバックグラウンドで何かを実行する必要がある場合に最適です。例えば。ダウンロード、ファイル内のテキストの検索など。
個人的にはHandlersを使用して、UIスレッドに変更を投稿するだけです。例えば。バックグラウンドスレッドでいくつかの計算を行い、ハンドラーを介して結果を投稿します。

結論:ほとんどの場合、AsyncTaskが必要です。

13
yanchenko

ServiceとAsyncTaskの違いに関する他の回答を補足するために、注目に値する[0]:

  • サービスは別個のプロセスではありません。 Serviceオブジェクト自体は、それが独自のプロセスで実行されていることを意味するものではありません。特に指定がない限り、その一部であるアプリケーションと同じプロセスで実行されます。
  • サービスはスレッドではありません。 (アプリケーションが応答しないエラーを回避するために)メインスレッドから作業を行うこと自体は手段ではありません。

サービスは、アプリケーションの重要な部分を説明するものになる傾向があります。通常、アクティビティに貢献したり、UIの応答性を向上させたりするAsyncTaskではありません。コードの明確さを向上させるだけでなく、サービスを他のアプリケーションと共有して、アプリと外界との間に明確なインターフェイスを提供することもできます。

本ではなく、開発者ガイドにはたくさんの良い答えがあると思います。

[0]ソース: http://developer.Android.com/reference/Android/app/Service.html#WhatIsAService

5
Uniqe
  • AsyncTask: UIをハングさせずに何かを実行し、UIの変更を反映したい場合。

例:ボタンクリックで何かをダウンロードし、同じアクティビティを維持し、進行状況バー/シークバーを表示して、ダウンロードされたパーセンテージを更新します。アクティビティがバックグラウンドに入ると、競合する可能性があります。

  • Service: UIを更新する必要のないバックグラウンドで何かを実行したい場合は、サービスを使用します。アプリケーションがフォアグラウンドにあるかバックグラウンドにあるかは関係ありません。

例: Android Marketからダウンロードされたアプリがステータスバーに通知を表示し、UIが前のページに戻り、他のことができるようになった場合。

4
Nital

サービス

サービスは、バックグラウンドで長時間実行される操作を実行できるアプリケーションコンポーネントであり、ユーザーインターフェイスを提供しません。別のアプリケーションコンポーネントがサービスを開始でき、ユーザーが別のアプリケーションに切り替えた場合でも、サービスはバックグラウンドで実行され続けます。さらに、コンポーネントはサービスにバインドして対話することができます。

いつ使用しますか?

UIのない​​タスクですが、長すぎないようにしてください。長いタスクにはサービス内のスレッドを使用します。一般的に長いタスク。

トリガー:メソッドonStartService()の呼び出し

トリガー元:任意のスレッド

実行先:ホスティングプロセスのメインスレッド。サービスは独自のスレッドを作成せず、別のプロセスで実行されません(特に指定しない限り)

制限/欠点:メインスレッドをブロックする可能性があります


AsyncTask

AsyncTaskは、UIスレッドの適切で簡単な使用を可能にします。このクラスを使用すると、スレッドやハンドラーを操作しなくても、UIスレッドでバックグラウンド操作を実行して結果を公開できます。非同期タスクは、バックグラウンドスレッドで実行され、その結果がUIスレッドで公開される計算によって定義されます。

いつ使用しますか?

メインスレッドと通信する必要のある小さなタスク並列のタスクの場合、複数のインスタンスを使用しますOR Executorディスクにバインドされたタスク。数ミリ秒以上かかる場合があります

トリガー:メソッドexecute()の呼び出し

トリガー元:メインスレッド

実行:ワーカースレッド。ただし、進行状況を公開するために、間にメインスレッドメソッドが呼び出される場合があります。

制限/欠点:

  • 1つのインスタンスは1回しか実行できません(したがって、ループで実行することはできません)
  • メインスレッドから作成して実行する必要があります

参照 リンク

1
akhilesh0707