サービス、非同期タスク、スレッドの違いは?


147

サービス、非同期タスク、スレッドの違いは何ですか。私が間違っていなければ、それらのすべてがバックグラウンドでいくつかのことをするために使用されます。それで、どれをいつ使用するかをどのように決定するのですか?


人々がしばしば混乱する可能性があるもう一つのことがあるようです- ローダー。関連スレッド- 非同期タスクvsスレッドvsサービスvsローダー
RBT

回答:


186

おそらくあなたはすでにそれらについてのドキュメントの説明を読んでいるので、私はそれらを繰り返すことはしませんが、代わりに私は自分の言葉で答えを出そうとします。

  • サービスはアクティビティに似ていますが、ユーザーインターフェイスはありません。たとえば天気を取得したい場合は、空のアクティビティを作成しないので、サービスを使用します。

  • スレッドはスレッドです。おそらく他の部分からすでに知っています。スレッドからUIを更新できないことを知っておく必要があります。これにはハンドラを使用する必要がありますが、さらに読んでください。

  • AsyncTaskは、使用することをお勧めするインテリジェントなスレッドです。それはそのメソッドを支援できるのでインテリジェントであり、UIスレッドで実行される3つのメソッドがあり、UIコンポーネントを更新するのに適しています。

Services、AsyncTasksを頻繁に使用しています。AsyncTaskでほとんどすべてを実行できるため、スレッドを少なくするか、まったくしないようにします。


1
ご説明ありがとうございます。それで、Webからデータをフェッチするアプリケーションを作成する必要がある場合、より良いオプションサービスまたは非同期タスクになりますか?
SpunkerBaba

16
両方を使用する必要があります。サービスを作成し、その中でAsyncTaskを使用します。
Pentium10、

4
上記の回答に追加して、AsyncTaskは4つのステップonPreExecute()、onProgressUpdate(Progress ...)onPostExecute(Result)、{running in UI thread}、doInBackground(Params ...){running in background thread}を実行します。UIスレッドで3つのメソッドを提供するため、ユーザーはハンドラーやコールバックを使用してUIを更新する必要はありません。
SpunkerBaba、2010

11
@ Pentium10:Service + AsyncTaskの代わりに、IntentServiceを頻繁に使用できます
njzk2

11
また、デフォルトでは、Androidサービスはメイン(UI)スレッドで実行されます。サービスがバックグラウンドで動作する必要がある場合は、別のスレッド(またはAsyncTask)で明示的に起動する必要があります。そうしないと、UIの応答性が中断され、アプリケーションが応答しないというエラーがスローされる可能性があります。Androidに関するサービスは、本質的に「見えない」「ミニチュア」アクティビティであり、必ずしも「バックグラウンド」ワーカーではありません。
CCJ 2013年

23

これはあなたの質問に対する最も簡単な答えです

メインスレッド「並列」で実行される実行の単位は重要なポイントです。メインスレッド以外の任意のスレッドからUIコンポーネントを更新することはできません。

AsyncTask

特別なスレッドで、UIを更新するヘルパーメソッドを提供します。そのため、AsyncTaskがバックグラウンドスレッドで実行される場合でも、基本的にUIを更新できます。プロセス間通信の処理は明示的に行う必要はありません。

サービス

上記の問題を解決するのは、それを呼び出すアクティビティとは別に存在するため、アクティビティが破棄されても実行を継続できるため、メインスレッドで実行されます(ANRに注意)バックグラウンドサービスを使用します(IntentServiceを拡張して、ワーカースレッドを自動的に作成します)あなたのために)サービスはUIのない​​アクティビティのようなもので、長いタスクに適しています


4
AyncTaskは、アクティビティのライフサイクルメソッドと同期していないため、デバイスの回転時に再作成されません。
CopsOnRoad 2017

4
AsyncTaskをアクティビティライフサイクルフックで作成し、電話を回転させるとアクティビティが破棄されて再起動します。AsyncTaskの以前のインスタンスは、破棄したアクティビティに接続されているため、「強制的に閉じる」ことができますが、AsynTaskの新しいインスタンスが再びトリガーされる様子もわかります。Fragmentsを使用してAsyncTaskを保持し、フラグメントにsetRetainInstance(true)を設定すると、役立ちます。
Alejandro Serret 2017

15

誰かが数日前に私に言っていたと思う情報はほとんどありません。

  • アクティビティーとサービスの間で、スレッドなどのグローバル変数を共有できます。
  • あなたのアプリケーションのすべてのグローバル変数と一緒にいる限り、まだ存在の活動があるか、サービスとして一掃されることはありません。
  • アプリにサービスのインスタンスがあり、OSがリソースを必要とする場合、最初にアクティビティを強制終了しますが、サービスがある限り、OSはグローバル変数とともにアプリケーションを消去しません。

私の使用例は次のとおりです。サーバーに接続されているグローバルスペースに1つのスレッドと、結果を表示するアクティビティがあります。ユーザーがホームボタンを押すと、アクティビティがバックグラウンドになり、新しいサービスが開始されます。次に、このサービスはスレッドから結果を読み取り、必要に応じて通知領域に情報を表示します。OSがアクティビティを破壊する心配はありません。サービスが実行されている限り、スレッドが破壊されることはわかっているからです。


9

つまり、Service for time consuming tasksAsyncTask for short-lived tasksThreadは、standard java constructionスレッド用です。


3

開発者の観点から:

スレッド:メインスレッドと並行してコードセットを実行するために使用されます。ただし、スレッド内でUIを処理することはできません。そのためには、を使用する必要がありますHandler。Hadlerはスレッドのように機能しますが、UIも処理できます。

ASyncTask:メインスレッドで動作させることができないタスクを処理するために使用されます。たとえば、HTTPリクエストはメインスレッドで処理できない非常に重い作業であるためASyncTask、バックグラウンドで非同期にメインスレッドと並行して動作します。対応する上で呼び出されるコールバックメソッドはほとんどありません。イベント。

サービス:バックグラウンドプロセスです。これは、UIが関連付けられていない処理を行う必要がある場合に使用されます。


1
Serviceを使用しない限り、バックグラウンドで実行する必要はありませんIntentService。UiThread Serviceからスタンダートを開始した場合は、UiThreadで実行されます。
yshahak 2017年

@yshahak正解ですが、ここでは詳細な定義は必要ありません。ユーザーはそれらの違いを知りたいだけです。
Rahul Raina 2017年

はい、ただしこれは正確でServiceはありません。デフォルトでは別のプロセスでは実行されず、他のコンポーネントを使用するアプリプロセスで実行されるためです。Serviceそれが内部に存在するスレッドのバックグラウンドで実行されると言う方が良いでしょう。
yshahak

上記の3つはすべて、申請プロセス内で機能します。ASyncTaskのpreExecute()およびpostExecute()メソッドはUIThreadで機能し、doInBackground()およびonProgress()はバックグラウンドスレッドで機能します。サービスはバックグラウンドスレッドで動作し、スレッドもバックグラウンドスレッドで動作します。ただし、ハンドラーはUIスレッドで動作します。
Rahul Raina 2017年

2

サービスは、アクティビティに長時間かかるタスクのようなものですが、非同期タスクを使用すると、スレッドを操作することなく、長い/バックグラウンド操作を実行し、その結果をUIスレッドに表示できます。

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