サービス、非同期タスク、スレッドの違いは何ですか。私が間違っていなければ、それらはすべてバックグラウンドでいくつかのことを行うために使用されます。では、どちらをいつ使用するかをどのように決定するのでしょうか。
6 に答える
おそらくあなたはすでにそれらについてのドキュメントの説明を読んでいます、私はそれらを繰り返すことはしません、代わりに私は私自身の言葉で答えを与えることを試みます、それらがあなたを助けることを願っています。
サービスはアクティビティに似ていますが、ユーザーインターフェイスはありません。たとえば、天気を取得する場合は、空白のアクティビティを作成しないでください。このために、サービスを使用します。
スレッドはスレッドです。おそらく他の部分からすでに知っているでしょう。スレッドからUIを更新できないことを知っておく必要があります。これにはハンドラーを使用する必要がありますが、さらに読んでください。
AsyncTaskは、使用することをお勧めするインテリジェントなスレッドです。メソッドを支援できるのでインテリジェントです。UIスレッドで実行されるメソッドは3つあり、UIコンポーネントを更新するのに適しています。
私はServices、AsyncTasksを頻繁に使用しています。AsyncTaskでほとんどすべてを実行できるので、スレッドを少なくするか、まったくスレッド化しません。
これはあなたの質問に対する最も簡単な答えです
スレッド
メインスレッドと「並列」に実行される実行ユニットは重要なポイントです。メインスレッド以外のスレッドからUIコンポーネントを更新することはできません。
AsyncTask
は特別なスレッドであり、UIを更新するためのヘルパーメソッドを提供するため、基本的にAsyncTaskがバックグラウンドスレッドで実行される場合でもUIを更新できます。プロセス間通信の処理は、明示的に行う必要はありません。
サービス
上記の問題を解決します。これは、アクティビティを呼び出すアクティビティとは別に存在するため、アクティビティが破棄されても実行を継続できるため、メインスレッドで実行されます(ANRに注意)バックグラウンドサービスを使用します(IntentServiceを拡張してワーカースレッドを自動的に作成します)あなたのために)。サービスはUIのないアクティビティのようなもので、長いタスクに適しています
数日前に誰かが私に言ってくれたらよかったと思う情報はもう少しあります。
- アクティビティとサービスの間で、スレッドなどのグローバル変数を共有できます。
- アクティビティまたはサービスがまだ存在している限り、アプリケーションとそのすべてのグローバル変数は消去されません。
- アプリにサービスのインスタンスがあり、OSにリソースが必要な場合、最初にアクティビティが強制終了されますが、サービスが存在する限り、OSはアプリケーションとそのグローバル変数を消去しません。
私のユースケースは次のようなものです。サーバーに接続されているグローバルスペースに1つのスレッドがあり、結果を表示するアクティビティがあります。ユーザーがホームボタンを押すと、アクティビティがバックグラウンドに移動し、新しいサービスが開始されます。次に、このサービスはスレッドから結果を読み取り、必要に応じて通知領域に情報を表示します。OSがアクティビティを破壊する心配はありません。サービスが実行されている限り、スレッドが破壊されることがわかっているからです。
つまり、Service for time consuming tasks
、AsyncTask for short-lived tasks
、Threadはstandard java construction
スレッド用です。
開発者の観点から:
スレッド:メインスレッドと並行してコードへのセットを実行するために使用されます。ただし、スレッド内でUIを処理することはできません。そのためには、を使用する必要がありますHandler
。スレッドをHadler
バインドしてUIスレッドにします。Runnable
Looper
ASyncTask:メインスレッドで動作させることができないタスクを処理するために使用されます。たとえば、HTTPリクエストはメインスレッドでは処理できない非常に重い作業であるため、HTTPリクエストをASyncTask
メインスレッドと並行してバックグラウンドで非同期的に処理します。対応するイベントで呼び出されるコールバックメソッドがいくつかあります。
サービス:同じApplication
プロセスでバックグラウンドで動作します。これは、UIが関連付けられていない処理を実行する必要がある場合に実装されます。
サービスはアクティビティの長い時間のかかるタスクのようなものですが、非同期タスクを使用すると、スレッドを操作しなくても、長い/バックグラウンド操作を実行し、その結果をUIスレッドに表示できます。