54

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

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

4

8 に答える 8

58

それらは、さまざまな目的のために非常に異なる方法で使用できます。

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

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

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

于 2013-03-01T21:39:53.613 に答える
51

AsyncTask現在実行しようとしていることのように、アクティビティに緊密にバインドされている短い反復タスクにはを使用する必要があります。IntentServiceアクティビティに関係なく、バックグラウンドで実行する必要があるスケジュールされたタスク(反復的または非反復的)を対象としています。

于 2013-03-01T21:33:14.073 に答える
22

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

IntentService は、作業にかかる時間に関係なく、常に利用可能であるべきものに適しています。AsyncTask はアクティビティの状態に大きく依存しているため、ほとんどの場合、IntentService を好みます。

いくつかのメモ:

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

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

于 2013-03-01T23:29:45.667 に答える
8

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

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

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

于 2015-03-22T16:44:18.533 に答える
6

上記のようAsyncTaskに、あなたの問題を解決します。

ただし、重要な弱点があることに注意してください 。「更新」AsyncTaskをうまく処理できません(たとえば、ローテーション中)。Activityたとえば、ユーザー AsyncTaskがまだコンテンツを読み込んでいるときにユーザーが電話を回転させると、問題が発生する可能性があります。これが実際に問題である場合は、次をお勧めしますAsyncTaskLoader

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

于 2013-03-01T22:16:11.050 に答える
-1

一部のデータをサーバーにアップロードしたり、サーバーからデータベースにデータを保存したりするなど、アクティビティと密接に結び付いていないタスクに使用する必要があるという点で、Intent サービスについて @DeeV と @ebarrenechea に同意します。

しかし、Android 3.0 以降では、AsyncTask を置き換えるローダー APIが導入されました。たとえば、アクティビティに表示する必要があるリストをロードするには、すべての構成変更とアクティビティのライフサイクルを適切に処理するように設計されたローダーを使用することをお勧めします。

Vogella ローダーのチュートリアル

于 2015-01-21T10:23:51.540 に答える