誰かが私に[〜#〜] true [〜#〜]違いを教えてもらえますか?
私の経験則では、AsyncTask
は、単一のActivity
に関連付けられた何かをしたいときのためのものであり、Service
は、継続する何かをしたいときのためのものです。開始したアクティビティの後、バックグラウンドになります。
したがって、UIを拘束せずにActivity
でバックグラウンド処理を少し実行したい場合は、AsyncTask
を使用します。次に、そのHandler
のデフォルトのActivity
を使用してメッセージを返し、メインスレッドで更新が行われるようにします。メインスレッドで更新を処理することには、2つの利点があります。UIの更新が正しく行われることと、同期の問題についてそれほど心配する必要がないことです。
たとえば、ダウンロードに時間がかかる可能性がある場合は、Service
を使用します。したがって、アプリケーションまたは別のアプリケーションで別のActivity
に移動した場合、Service
は実行を継続し、ファイルをダウンロードし続けることができるため、アプリケーションに戻ったときに準備が整います。この場合、ダウンロードが完了したら ステータスバー通知 を使用するので、ユーザーは都合のよいときにいつでもアプリケーションに戻ることができます。
長時間実行されるプロセスにAsyncTask
を使用すると、Activity
から移動した後も続行される場合がありますが、次のようになります。
Activity
がバックグラウンドにある場合、結果などでUIを更新しようとすると問題が発生する可能性があります。Activity
は、Service
よりもメモリが必要な場合、Androidによって強制終了される可能性がはるかに高くなります。長期間バックグラウンドで実行する必要があるものがある場合は、Serviceを使用します。それはいかなる活動にも拘束されません。正規の例は音楽プレーヤーです。
AsyncTaskは、現在のアクティビティ中にバックグラウンドで何かを実行する必要がある場合に最適です。例えば。ダウンロード、ファイル内のテキストの検索など。
個人的にはHandlersを使用して、UIスレッドに変更を投稿するだけです。例えば。バックグラウンドスレッドでいくつかの計算を行い、ハンドラーを介して結果を投稿します。
結論:ほとんどの場合、AsyncTaskが必要です。
ServiceとAsyncTaskの違いに関する他の回答を補足するために、注目に値する[0]:
サービスは、アプリケーションの重要な部分を説明するものになる傾向があります。通常、アクティビティに貢献したり、UIの応答性を向上させたりするAsyncTaskではありません。コードの明確さを向上させるだけでなく、サービスを他のアプリケーションと共有して、アプリと外界との間に明確なインターフェイスを提供することもできます。
本ではなく、開発者ガイドにはたくさんの良い答えがあると思います。
[0]ソース: http://developer.Android.com/reference/Android/app/Service.html#WhatIsAService
例:ボタンクリックで何かをダウンロードし、同じアクティビティを維持し、進行状況バー/シークバーを表示して、ダウンロードされたパーセンテージを更新します。アクティビティがバックグラウンドに入ると、競合する可能性があります。
例: Android Marketからダウンロードされたアプリがステータスバーに通知を表示し、UIが前のページに戻り、他のことができるようになった場合。
サービスは、バックグラウンドで長時間実行される操作を実行できるアプリケーションコンポーネントであり、ユーザーインターフェイスを提供しません。別のアプリケーションコンポーネントがサービスを開始でき、ユーザーが別のアプリケーションに切り替えた場合でも、サービスはバックグラウンドで実行され続けます。さらに、コンポーネントはサービスにバインドして対話することができます。
いつ使用しますか?
UIのないタスクですが、長すぎないようにしてください。長いタスクにはサービス内のスレッドを使用します。一般的に長いタスク。
トリガー:メソッドonStartService()の呼び出し
トリガー元:任意のスレッド
実行先:ホスティングプロセスのメインスレッド。サービスは独自のスレッドを作成せず、別のプロセスで実行されません(特に指定しない限り)
制限/欠点:メインスレッドをブロックする可能性があります
AsyncTaskは、UIスレッドの適切で簡単な使用を可能にします。このクラスを使用すると、スレッドやハンドラーを操作しなくても、UIスレッドでバックグラウンド操作を実行して結果を公開できます。非同期タスクは、バックグラウンドスレッドで実行され、その結果がUIスレッドで公開される計算によって定義されます。
いつ使用しますか?
メインスレッドと通信する必要のある小さなタスク並列のタスクの場合、複数のインスタンスを使用しますOR Executorディスクにバインドされたタスク。数ミリ秒以上かかる場合があります
トリガー:メソッドexecute()の呼び出し
トリガー元:メインスレッド
実行:ワーカースレッド。ただし、進行状況を公開するために、間にメインスレッドメソッドが呼び出される場合があります。
制限/欠点:
参照 リンク