6

私はまだプログラミングに非常に慣れていないため、メインスレッド、非同期タスク、サービス、スレッドの概念を完全には理解していないため、質問を許してください。メインスレッドからいくつかのタスクを実行したいので、Services for Android に関するドキュメントを読んでいます。それは言います:

メイン スレッドの外で作業を実行する必要があるが、ユーザーがアプリケーションと対話している間のみ実行する必要がある場合は、サービスではなく新しいスレッドを作成する必要があります。

1.アプリを終了するとすぐに「スレッド」が停止すると言っていますか (例: ホーム ボタン)?

たとえば、アクティビティの実行中にのみ音楽を再生したい場合は、onCreate() でスレッドを作成し、onStart() で実行を開始し、onStop() で停止します。従来の Thread クラスの代わりに、AsyncTask または HandlerThread の使用も検討してください。スレッドの詳細については、プロセスとスレッドのドキュメントを参照してください。

2.スレッドが Java に組み込まれている場合、Android に AsyncTasks があるのはなぜですか?

サービスを使用する場合でも、デフォルトではアプリケーションのメイン スレッドで実行されるため、集中的な操作やブロック操作を実行する場合は、サービス内に新しいスレッドを作成する必要があります。

3.これは基本的に、ほぼすべてのサービスの内部にスレッドが作成されるということですか?

4.サービス内で AsyncTask を開始するのは悪いことですか?

4

4 に答える 4

11

1.アプリを終了するとすぐに「スレッド」が停止すると言っていますか (例: ホーム ボタン)?

Aは、それを開始した が破棄Threadされるときに破棄する必要があります。Threadしたがって、 で を開始したThread場合ActivityActivityが破棄されるか に転送されたときに、 を破棄する必要がありServiceます。たとえば、 で音楽を開始してそこで曲を更新することはできますが、が破壊されThreadても再生を続けたい場合は、に移動する必要があります。ActivityService

2.スレッドが Java に組み込まれている場合、Android に AsyncTasks があるのはなぜですか?

を使用すると、バックグラウンド作業を実行し、バックグラウンド作業実行される前、実行中、および実行後にAsyncTask簡単に更新できます。UIdoInBackground()UI Thread

3.これは基本的に、ほぼすべてのサービスの内部にスレッドが作成されるということですか?

必ずしもそうではありませんが、そのThread中に作成することができます

4.サービス内で AsyncTask を開始するのは悪いことですか?

いいえ、できます。

AsyncTaskは、バックグラウンド作業を行うための優れた方法です。そのメソッドにより、 の更新が非常に簡単になりUIます。ただし、それらの使用方法を完全に理解するには、ドキュメントを注意深く (場合によっては数回) 読む必要があります。また、これらは短期間の操作用であるため、ネットワークデータのダウンロードには適していますが、数秒以上続くものには使用しないでください(ドキュメントによると)

于 2013-07-30T18:22:41.003 に答える
5
  1. アプリを終了しても、スレッドはすぐには停止しません。別のスレッドを使用するという提案は、アプリの GUI をブロックしないようにするためだけです。

  2. スレッドの作成はコストのかかるプロセスであるため、AsyncTasks は実際には舞台裏で ThreadPool を使用します。存続期間の短いタスクが多数ある場合、 を使用するAsyncTaskと、アプリケーションの GUI をブロックすることなくタスクをすばやく簡単に実行できます。

  3. はい、本質的に。ただし、サービスはスレッドよりも重いです。スレッドの代わりにサービスを使用することはお勧めできません。また、サービスを実際に他のプロセス全体で実行することもできます。参考までに。

  4. いいえ。実行する短命のタスクが多数ある場合は、良い考えです。

メイン スレッドからタスクを実行するだけの場合は、サービスは必要ありません。別のスレッドを作成するだけです。

AsyncTask舞台裏では、実行のためにタスクをスレッド プールに送信するだけです。ネットワーク トラフィックの解析など、短期間のタスクが多数ある場合AsyncTaskは最適です。

ただし、大量のリクエストを処理している場合は、タスクを実行するスレッド プールをより細かく制御したい場合があります。

于 2013-07-30T18:18:16.910 に答える
1
  1. いいえ

  2. メイン スレッドが UI を制御し、asynctasks が UI の遅延をなくしながらより重いタスクを実行できるためです。

  3. いいえ、しかし、サービスでインターネットからの読み込みなどの重い作業を行う場合は、asynctask を使用する必要があります。ほとんどのサービスはインターネットからデータをロードするために使用されるため、ほとんどのサービスには非同期タスクがあります。アクティビティが終了した後もサービスを存続させるには、それを指定する必要があることに注意してください。適切に構成されていない限り、サービスはデフォルトでアクティビティとともに終了します

  4. いいえ

于 2013-07-30T18:18:46.190 に答える