Android:AsyncTask vsサービス


138

AsyncTaskローダーに関する多くの質問に対する回答をここで読みますが、サービスについては何も読みませんか?サービスはあまりよく知られていませんか、それとも非推奨になっているのか、いくつかの悪い属性があるのでしょうか?違いは何ですか?

(ところで、私はそれについて他のスレッドがあることを知っていますが、開発者が実際の問題に対してどちらか一方を使用する方がよいかどうかを簡単に判断できるようにする明確な違いを実際に述べているものはありません。)

回答:


272

場合によっては、AsyncTaskまたはのいずれかを使用して同じタスクを実行することができますが、Service通常、一方が他方よりもタスクに適しています。

AsyncTaskは、UIスレッドで実行できない、一度限りの時間のかかるタスク用に設計されています。一般的な例は、ボタンが押されたときのデータのフェッチ/処理です。

Serviceは、バックグラウンドで継続的に実行されるように設計されています。ボタンが押されたときにデータをフェッチする上記の例では、サービスを開始し、データをフェッチさせてから停止することができますが、これは非効率的です。AsyncTaskを実行してデータを返し、実行されるを使用する方がはるかに高速です。

ただし、バックグラウンドで継続的に何かを行う必要がある場合Serviceは、a が最善の策です。この例には、音楽の再生、新しいデータの継続的な確認などが含まれます。

また、Sherifがすでに述べたように、サービスは必ずしもUIスレッドから実行されるとは限りません。

ほとんどの場合、Servicesは、アプリケーションActivityが開いていなくてもコードを実行したい場合に使用します。AsyncTaskは、UIスレッドから実行コードを信じられないほど簡単にするように設計されています。


2
2010年のGoogle I / Oからのこの講演youtube.com/watch?v=xHXn3Kg2IQEで、プレゼンターがREST APIからデータを取得するための3つの異なるメソッドを提供し、最初のメソッドがサービスを使用するのは興味深いことです。私はAndroidの専門家ではありませんが、Computerishの発言が基本的に正しいとの印象もありました。
wuliwong 2012

10
最後の段落の「サービスは、アプリケーションのアクティビティが開いていない場合でもコードを実行するためのものです」。これは、AsyncTaskまたはバックグラウンドスレッドにも当てはまります。つまり、アクティビティを押し戻すか、finish()を呼び出し、アクティビティが表示されないが、バックグラウンドスレッドは、アプリプロセスを終了する(たとえば、最近のタスクから交換する)まで実行されます。私はこれを4.4.2 Google Nexus AOSPハタで確認しました
Shirish Herwade

10
ただし、AsyncTaskの実行中にAsyncTaskを開始したアクティビティが強制終了され、UIを更新する必要がある場合は、AsyncTaskがトリッキーになる可能性があります(アクティビティは既に破棄されているため機能しません)。手動で停止する必要のないIntentServiceを使用しないのはなぜですか。
AgentKnopf 2014

素晴らしい点。サービスについての良い説明。これは、作業が行われてもバックグラウンドで継続的に実行されるサービスです。
BABU K

3
@LarsH私が間違っている場合は訂正してください。ただし、アクティビティ/フラグメントでBroadcastReceiverを使用でき、完了したら、IntentServiceからBroadcastを起動できます。カバーする必要があるアクティビティ/フラグメントの再作成時にブロードキャストに再登録できるため。別の代替案は、UIの更新にEventBusを使用することです(私はそれらを回避しようとしますが、コードがimoを追跡するのを難しくします)。
AgentKnopf 2016

58

サービスは完全に異なります。サービスはスレッドではありません。

アクティビティがサービスにバインドされ、サービスには、呼び出されたときに呼び出しスレッドをブロックするいくつかの関数が含まれています。サービスは、摂氏から度に温度を変更するために使用される場合があります。バインドするアクティビティはすべて、このサービスを取得できます。


ただしAsyncTask、バックグラウンドでいくつかの作業を行うと同時に、呼び出し元のスレッドに結果を報告する機能を持つスレッドです。

ちょうど考え:サービスにAsyncTaskオブジェクトがあるかもしれません!


2
ただし、サービスはバックグラウンドで実行されていると説明されており、アプリケーションが閉じられていても継続します。AsyncTaskは、バックグラウンドで何かを行うためにも使用されます。わかる?
erikbwork 2011

1
そうですが、サービスは何かをしているかもしれないし、していないかもしれません。彼らは長続きするOBJECTです
シェリフエルハチブ

「サービスにAsyncTaskオブジェクトがある可能性があります!」ご指摘いただきありがとうございます。しかし、それは良い考えでしょうか?それはあなたがお勧めするものですか?または、サービスでより基本的なスレッド化手法を使用する方が良いでしょうか?
RenniePet 2013

「アクティビティはサービスにバインドする」とは限りません。
JacksOnF1re 2015

@ JacksOnF1reこれは、私が最初にコーディングを開始したときのようなものです:pですが、「あなたのアクティビティはサービスにバインドされています」というのは正しい説明です。私もこのサービスに拘束される可能性があります。冷蔵庫も拘束力があるかもしれません。これにより、ステートメントが無効になるわけではありません。.とにかくjk
Sherif elKhatib '

7

Serviceは、Androidフレームワークのコンポーネントの1つであり、実行にUIを必要としません。つまり、ユーザーがアプリをアクティブに使用していない場合でも、サービスで何らかの操作を実行できます。これは、サービスが別のスレッドで実行されるわけではありませんが、メインスレッドで実行され、必要に応じて操作を別のスレッドで実行できます。使用例としては、バックグラウンドで音楽を再生したり、ユーザーとのやり取りなしでデータをバックグラウンドでサーバーと同期したりします。

AsyncTask一方、別のスレッドで実行されるUIブロックタスクに使用されます。これは、新しいスレッドを作成し、スレッドを作成して維持し、結果をメインスレッドに返送するすべてのタスクがAsyncTaskによって処理されるときにタスクを実行するのと同じです。


あなたの答えが質問に何かを追加すると思う理由を特定できますか?
erikbwork 2017

2
他の答えは、初心者が理解するには短すぎるか長すぎるかのどちらかです。だから私は例を挙げて簡単な言葉で正確に答えました
arjun '10 / 02/17

6

サービスasynctasksは、ほぼ、同じことをやっているほとんどのサービスやasynctaskを.usingあなたの要件がされているかに依存します。

例として、ボタンを押した後、または画面を変更した後、サーバーからリストビューにデータをロードする場合は、asynctask.itをメインUIスレッドと並行して実行する(バックグラウンドで実行する)ようにします。メインUIスレッドでは、アプリの終了後に非同期タスクはありません。

しかし、サービスはそのようなものではありません。サービスを開始すると、アプリを終了した後に実行できます。ただし、サービスを停止している場合を除きます。たとえば、要件によって異なります。データの受信を確認し続けるか、ネットワーク状態を確認するか継続的にサービスを利用する方がよいでしょう。

幸せなコーディング。


1
こんにちは、アシャナ。すでに回答されている質問に対して、なぜこの回答を提供したのですか?既存のマークされた回答に不満がありますか?それとも、あなたが何か言いたいことがあるすべての質問にあなたの意見を書いて、SOプロファイルを構築しようとしていますか?または完全に異なる何か?それを理解することはできませんが、私は最近かなり頻繁にそのパターンを参照してください。
erikbwork

3
ええ、私は答えが既に与えられていることを知っています、そして私がここで仲間に正しい答えまたは私の意見を与えれば、私はここで多くの問題を見ませんか?同じ質問の答えを探しているのはあなただけではないため、上記の解決策を理解するのが難しい人が下にスクロールして、自分に合った答えを探すことができれば、簡単に理解できます。コメントのおかげで、プログラミングの天才やプロではなく、他の人を助けたいだけで、私がすでに知っていることを他の人に教えようとします:)
Ashana.Jackol

1

場合によっては、両方を使用して同じ機能を実現できます。非同期タスクとは異なり、サービスには独自のライフサイクルがあり、コンテキストを継承します(サービスは非同期タスクよりも堅牢です)。アプリを終了してもサービスは実行できます。アプリを閉じた後でも何かしたい場合で、コンテキスト変数も必要な場合は、Serviceを使用します。

例:音楽を再生したいが、ユーザーがアプリを離れたときに一時停止したくない場合は、間違いなくサービスに行きます。


1

比較ローカル、インプロセス、基底クラスのサービスに✱AsyncTask

✱(この回答は、エクスポートされたサービス、またはクライアントのプロセスとは異なるプロセスで実行されるサービスには対応していません。これは、予想されるユースケースがのユースケースと大幅に異なるためAsyncTaskです。また、簡潔にするために、Serviceサブクラスは、(例えばIntentServiceJobService)ここでは無視されます。)

プロセス寿命

A ServiceはOSに対して、「ユーザーと対話せずに長時間実行される操作を実行したいというアプリケーションの要望」を表します[ ref ]。

実行しているService間、Androidはプロセスを強制終了させたくないことを理解しています。これは、Activity画面に表示されている場合にも当てはまります。フォアグラウンドサービスを実行している場合は特に当てはまります。(すべてのアプリケーションコンポーネントがなくなると、Androidは「ああ、今はこのアプリを終了するのに良いタイミングなので、リソースを解放できる」と考えます。)

また、からの最後の戻り値に応じてService.onCreate()、Androidは、リソースのプレッシャーのために強制終了されたアプリ/サービスを「復活」しようとする可能性があります[ 参照 ]。

AsyncTasks何もしないでください。アプリがCPUを使用しているからといって、Androidがアプリを存続させることはできません。アプリにはまだやるべき作業があることを知るための何らかの方法が必要です。そのためServices、OSに登録されていますが、登録されてAsyncTasksいません。

マルチスレッド

AsyncTasks すべては、作業を行うバックグラウンドスレッドを作成し、その作業の結果をスレッドセーフな方法でUIスレッドに提示することです。

スレッドプール[ ref ]のAsyncTask制限に従い、新しい実行が行われるたびに、一般に同時実行性(スレッド数)が増加しAsyncTasks'sます。

Service一方、メソッドは常にUIスレッド [ ref ]で呼び出されます。これが適用されるonCreate()onStartCommand()onDestroy()onServiceConnected()、などだから、ある意味では、Servicesバックグラウンドでない「実行」を行います。起動したら(onCreate())、そこに "座って"います-クリーンアップする時間になるまで、onStartCommand()、などを。

つまり、追加を追加Servicesしても同時実行性は向上しません。サービスメソッドは、UIスレッドで実行されるため、大量の作業を行うには適していない

もちろん拡張できます Serviceて独自のメソッドを追加し、必要な任意のスレッドから呼び出すことができます。ただし、それを行う場合、スレッドセーフティの責任はフレームワークではなくあなたにあります。

バックグラウンドスレッド(または他の種類のワーカー)をに追加するService場合は、自由に追加できます。あなたは/バックグラウンドスレッドを開始することができますAsyncTaskService.onCreate()、たとえば、。ただし、すべてのユースケースでこれが必要なわけではありません。例えば:

  • Service「バックグラウンド」で位置情報の更新を継続して取得できるように、実行を継続したい場合があります(つまり、Activities画面上に)。
  • または、アプリを存続させてBroadcastReceiver長期的に「暗黙的」に登録を維持することもできます(API 26以降、マニフェストを使用してこれを常に実行できるわけではないため、代わりに実行時に登録する必要があります。 [ ref ])。

これらの使用例のどちらも、大量のCPUアクティビティを必要としません。彼らはただアプリが殺されないことを要求します。

労働者として

Servicesタスク指向ではありません。これらは、「タスクを実行する」および「結果を配信する」ようにAsyncTasksは設定されていません。Services(すべてのメソッドが単一のスレッドで実行されるという事実にもかかわらず)スレッド安全性の問題を解決しません。AsyncTasks一方で、その複雑さを処理します。

注意AsyncTaskされて廃止される予定。しかし、それはあなたのあなたを交換する必要がありますという意味ではありませんAsyncTasksServices!(もしあなたがこの答えから何かを学んだなら、それだけははっきりしているはずです。)

TL; DR

Servicesほとんどが「存在する」ためにそこにいます。これらはオフスクリーンのようなものActivityで、アプリが生き続ける理由を提供しますが、他のコンポーネントが「作業」を行います。AsyncTasks「働く」ことはできますが、それ自体では、プロセスを存続させることはできません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.