web-dev-qa-db-ja.com

アプリケーションにAsyncTaskまたはIntentServiceを使用する必要がありますか?

私はAndroidとインターネット接続について読み回しており、これを処理するさまざまな方法があることに気づきました AsyncTaskIntentService 。ただし、どちらを使用するかはまだわかりません。私のアプリケーションは、基本的にGoogleマップを備えたロケーション/トレイルファインダーです。インターネット接続を使用して、したがって、ユーザーがマップを新しい場所に移動またはスワイプするたびに、最も近いトレイルで更新され、新しいトレイルが追加され、ユーザーがトレイルを評価できるようになります。

これでAsyncTaskで十分ですか、それともIntentServiceを使用する必要がありますか?

52
Johnathan Au

あなたが現在やろうとしていることのように、アクティビティに強く結び付けられている短い繰り返しのタスクには、AsyncTaskを使用する必要があります。 IntentServiceは、アクティビティに関係なく、バックグラウンドで実行されるスケジュールされたタスク(反復または非反復)により適しています。

48
ebarrenechea

それらは異なる目的のために非常に異なって使用することができます。

AsyncTaskは、ユーザーに常に何かを伝えたり、メインスレッドで定期的に操作を実行したりする必要がある場合に使用できる便利なスレッドユーティリティです。それは多くのきめ細かい制御を提供し、その性質のためActivityでの作業は非常に簡単ですが、IntentServiceは通常BroadcastReceiverまたはIBinderフレームワーク。

IntentServiceAsyncTaskと非常によく似ていますが、その目的はバックグラウンドでのダウンロード、アップロード、またはユーザーとの対話やメインスレッドを必要としないその他のブロック操作を目的としています。たとえば、マップをダウンロードしてキャッシュする場合は、IntentServiceを呼び出して、ダウンロードするためにユーザーがアプリを見る必要がないようにします。同様に、サーバーにデータを送信している場合、IntentServiceはこの点で非常に役立ちます。開始して忘れることができるからです。ユーザーは、たとえば、アプリにコメントを入力して「送信」を押すことができます。 「送信」はコメントを取得し、バックグラウンドスレッドでサーバーに送信するIntentServiceを起動します。ユーザーは「送信」を押してすぐにアプリを終了できますが、コメントは最終的にはサーバーに到達します(もちろんエラーが発生しないことを前提としています)。一方、AsyncTaskActivityを使用してこれを実行した場合、システムは交換の途中でプロセスを強制終了する可能性があり、処理が行われる場合と行われない場合があります。

一般的に、どちらも長時間実行されるアプリケーション向けではありません。それらは、1回限りの短い操作を目的としています。永続的なアクションや長時間実行されるアクションに使用できますが、お勧めしません。

55
DeeV

AsyncTaskは、構成の変更やアクティビティを再起動するその他のこととうまく機能しません。

IntentServiceは、作業にかかる時間に関係なく、常に利用可能なものに適しています。 AsyncTaskはActivity状態に非常に依存しているため、ほとんどの場合、IntentServiceを好みます。

いくつかのメモ:

  • AsyncTaskはbest UIに戻るべきクイックタスクですが、さまざまな状況で使用できます。
  • 「メインスレッドで定期的に操作を実行する」という文はあいまいです。 AsyncTaskは、とは異なるメインスレッドである新しいバックグラウンドスレッドを生成し、新しいスレッドで処理を実行します。したがって、名前はAsyncTaskです。
  • IntentServiceはBroadcastReceiverフレームワークを「操作」する必要はありません。必要なのは、ローカルブロードキャストインテントを送信し、アクティビティでそれを検出することだけです。これがAsyncTaskよりも難しいかどうかはわかりません。
  • IntentService isは、長時間実行されるタスクを実行するためのもので、バックグラウンドで実行されます。
  • AsyncTaskLoaderは使用しても構いませんが、CursorLoaderなどの基本クラスとなることを目的としています。ユーザーが新しい場所に移動したときに「近くの」トレイルを更新する場合は、IntentServiceの方がおそらく良いでしょう。

場所を更新する前に、接続を確認することを忘れないでください。

21
Joe Malin

AsyncTasksはアクティビティに非常に密接にバインドされており、AsyncTaskを作成したアクティビティから移動すると、ウィンドウリークエラーが発生することがよくあります。ただし、進行状況の割合をすばやく更新できるため、ProgressBarの表示には適しています。

IntentServicesはよりクリーンで安全です。あなたが初心者Android開発者である場合、実装がより困難になりますが、それらを開始して処理する方法を学ぶと、おそらくAsyncTasksに戻ることはないでしょう!

IntentServicesを使用すると、アプリでよりモジュール化された設計も可能になります。通常、すべてのIntentServicesに個別のクラスを作成しますが、AsyncTasksにはActivity内部クラスとして作成します。 AsyncTaskをActivityから分離する場合、AsyncTaskコンストラクターのActivity ContextおよびViewオブジェクトを渡す必要があります。

8
Lou Morda

前述のように、AsyncTaskは問題を解決します。

ただし、AsyncTaskには重大な弱点があることに注意してください。Activityの「更新」(ローテーション中など)をうまく処理できません。たとえば、AsyncTaskがまだデータを読み込んでいる間にユーザーが電話を回転させると、問題になる可能性があります。これが本当にあなたにとって問題であれば、AsyncTaskLoaderをお勧めします:

http://developer.Android.com/reference/Android/content/AsyncTaskLoader.html

6
ivan.aguirre

AsyncTaskIntentServiceには多くの同じものがあります

  • ワーカースレッドでタスクを実行できます
  • バックグラウンドで実行できます
  • タスクがイベントを終了するまで実行し続け、それを開始したアクティビティが破棄される
  • タスクの実行中またはタスクの完了後にUIの更新を通知できます
    • AsyncTaskには、onProgressUpdateonPostExecuteを使用するか、必要に応じてBroadcastReceiverを使用できます
    • IntentServiceには、BroadcastReceiverを使用します

異なる

1)実行中または実行終了後にタスクを送信する

タスクがある例:fileNameのサーバーベースからファイルをダウンロードします。

使用AsyncTask

AsyncTaskの1つのインスタンスである場合、ファイルAのダウンロードの実行中にcannotダウンロードファイルBのAsyncTaskを実行します(_Java.lang.IllegalStateException: Cannot execute task: the task is already running._を取得するため)。また、ファイルAのダウンロードが完了した後、ダウンロードファイルBを実行できません(Java.lang.IllegalStateException: Cannot execute task: the task has already been executed (a task can be executed only once)を取得するためです。
ファイルAのダウンロード中またはダウンロード後にファイルBをダウンロードするには、AsyncTaskの新しいインスタンスを作成する必要があります。
=>ファイルAとファイルBをダウンロードするには、AsyncTaskの2つのインスタンスが必要です=> 2つのワーカースレッドを作成しました

使用IntentService

ファイルAのダウンロード中に、canファイルBをダウンロードする意図を送信しました=>ダウンロードファイルAが終了すると、ダウンロードファイルBが自動的に開始されます=>新しいインスタンスは不要で、新しいワーカースレッドは不要です。

ファイルBをダウンロードする意図を送信した場合afterファイルAのダウンロードが終了しましたか?ファイルAのダウンロードが終了すると、IntentSeviceは破棄されます(タスクがなくなったため)。したがって、ダウンロードファイルBを開始すると、Serviceの新しいインスタンスが作成されますが、新しいスレッドは作成されません(サービスは、IntentSeviceコンストラクターで定義された1つのワーカースレッドのみを使用します

2)AsyncTaskの実装はIntentServiceより簡単です

[〜#〜] using [〜#〜]
AsyncTaskIntentServiceには同じものがあるので、ほとんどの場合、AsyncTaskまたはIntentServiceを使用できます。しかしながら

  • 1 AsyncTaskでUIを開始、終了、対話するタスクにActivityをよく使用します
  • 私はよくIntentServiceを使用して、どのActivityからもUIを開始/終了し、対話するか、対話しないタスクを実行します。

この答えは私のテストに基づいています。私が間違っている場合は修正してください。お役に立てば幸いです。

4
Phan Van Linh

つまり、AsyncTaskは、メインスレッドと通信する必要がある短いタスクを対象としています。 IntentServiceは、メインスレッドと通信する必要のない長いタスクを対象としています。

詳細については、これらのリンクを確認してください

http://www.onsandroid.com/2011/12/difference-between-Android.html

https://medium.com/@skidanolegs/asynctask-vs-intentservice-1-example-without-code-5250bea6bdae

https://Android.jlelse.eu/using-intentservice-vs-asynctask-in-Android-2fec1b853ff4

0