私はAndroidとインターネット接続について読み回しており、これを処理するさまざまな方法があることに気づきました AsyncTask
と IntentService
。ただし、どちらを使用するかはまだわかりません。私のアプリケーションは、基本的にGoogleマップを備えたロケーション/トレイルファインダーです。インターネット接続を使用して、したがって、ユーザーがマップを新しい場所に移動またはスワイプするたびに、最も近いトレイルで更新され、新しいトレイルが追加され、ユーザーがトレイルを評価できるようになります。
これでAsyncTask
で十分ですか、それともIntentService
を使用する必要がありますか?
あなたが現在やろうとしていることのように、アクティビティに強く結び付けられている短い繰り返しのタスクには、AsyncTask
を使用する必要があります。 IntentService
は、アクティビティに関係なく、バックグラウンドで実行されるスケジュールされたタスク(反復または非反復)により適しています。
それらは異なる目的のために非常に異なって使用することができます。
AsyncTask
は、ユーザーに常に何かを伝えたり、メインスレッドで定期的に操作を実行したりする必要がある場合に使用できる便利なスレッドユーティリティです。それは多くのきめ細かい制御を提供し、その性質のためActivity
での作業は非常に簡単ですが、IntentService
は通常BroadcastReceiver
またはIBinder
フレームワーク。
IntentService
はAsyncTask
と非常によく似ていますが、その目的はバックグラウンドでのダウンロード、アップロード、またはユーザーとの対話やメインスレッドを必要としないその他のブロック操作を目的としています。たとえば、マップをダウンロードしてキャッシュする場合は、IntentService
を呼び出して、ダウンロードするためにユーザーがアプリを見る必要がないようにします。同様に、サーバーにデータを送信している場合、IntentService
はこの点で非常に役立ちます。開始して忘れることができるからです。ユーザーは、たとえば、アプリにコメントを入力して「送信」を押すことができます。 「送信」はコメントを取得し、バックグラウンドスレッドでサーバーに送信するIntentService
を起動します。ユーザーは「送信」を押してすぐにアプリを終了できますが、コメントは最終的にはサーバーに到達します(もちろんエラーが発生しないことを前提としています)。一方、AsyncTask
でActivity
を使用してこれを実行した場合、システムは交換の途中でプロセスを強制終了する可能性があり、処理が行われる場合と行われない場合があります。
一般的に、どちらも長時間実行されるアプリケーション向けではありません。それらは、1回限りの短い操作を目的としています。永続的なアクションや長時間実行されるアクションに使用できますが、お勧めしません。
AsyncTaskは、構成の変更やアクティビティを再起動するその他のこととうまく機能しません。
IntentServiceは、作業にかかる時間に関係なく、常に利用可能なものに適しています。 AsyncTaskはActivity状態に非常に依存しているため、ほとんどの場合、IntentServiceを好みます。
いくつかのメモ:
場所を更新する前に、接続を確認することを忘れないでください。
AsyncTasksはアクティビティに非常に密接にバインドされており、AsyncTaskを作成したアクティビティから移動すると、ウィンドウリークエラーが発生することがよくあります。ただし、進行状況の割合をすばやく更新できるため、ProgressBarの表示には適しています。
IntentServicesはよりクリーンで安全です。あなたが初心者Android開発者である場合、実装がより困難になりますが、それらを開始して処理する方法を学ぶと、おそらくAsyncTasksに戻ることはないでしょう!
IntentServicesを使用すると、アプリでよりモジュール化された設計も可能になります。通常、すべてのIntentServicesに個別のクラスを作成しますが、AsyncTasksにはActivity内部クラスとして作成します。 AsyncTaskをActivityから分離する場合、AsyncTaskコンストラクターのActivity ContextおよびViewオブジェクトを渡す必要があります。
前述のように、AsyncTask
は問題を解決します。
ただし、AsyncTask
には重大な弱点があることに注意してください。Activity
の「更新」(ローテーション中など)をうまく処理できません。たとえば、AsyncTask
がまだデータを読み込んでいる間にユーザーが電話を回転させると、問題になる可能性があります。これが本当にあなたにとって問題であれば、AsyncTaskLoader
をお勧めします:
http://developer.Android.com/reference/Android/content/AsyncTaskLoader.html
AsyncTask
とIntentService
には多くの同じものがあります
AsyncTask
には、onProgressUpdate
、onPostExecute
を使用するか、必要に応じて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 [〜#〜]AsyncTask
とIntentService
には同じものがあるので、ほとんどの場合、AsyncTask
またはIntentService
を使用できます。しかしながら
AsyncTask
でUIを開始、終了、対話するタスクにActivity
をよく使用しますIntentService
を使用して、どのActivity
からもUIを開始/終了し、対話するか、対話しないタスクを実行します。この答えは私のテストに基づいています。私が間違っている場合は修正してください。お役に立てば幸いです。
つまり、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