1

Android 向けの開発を学ぶと、UI スレッド内で何らかの種類のプロセス (5 秒以上かかるプロセス) が実行されている場合、システムは悪名高い ANR メッセージを表示することを学びます。そんな時、邪悪な怪物 AsyncTask が登場します。最初はこのクラスが救世主だと思っていましたが、それが開発における最大の問題であることに気付きました... 回転や UI イベントの処理が非常に問題になり、苦痛にさえなります。皆さんはどう思いますか... AsyncTasks は苦労する価値がありますか? 画面の回転に関係なく、長時間実行されるタスクを実行する問題を軽減する他の方法はありますか? おそらくあなたは、なぜそれをサービスにしないのかと言うと思います...ええ、それは解決策ですが、それでは私の本当の質問に行きましょう。サービスのみを使用し、AsyncTasks の使用を完全に停止しないでください...

4

2 に答える 2

2

開発中は、実行に適したコンポーネントを選択することをお勧めします。要件をクリアする必要があり、それに応じて、Serviceまたはのいずれかを選択できますAsyncTask

  • サービスは、他のコンポーネントから独立して動作するAndroidコンポーネントです。アクティビティは行ったり来たりする場合がありますが、必要に応じてサービスを継続することもできます。これらは、複数のアクティビティが依存する状態の管理からcronジョブとしての機能、より長いアプリウィジェットの更新の処理まで、さまざまな役割を果たします。

  • AsyncTaskは、メインアプリケーションスレッドからいくつかの作業を実行するように調整するクラスです。AsyncTaskの実装者とユーザーからすると、AsyncTaskがそのちょっとした魔法をどのように実行するかは一般的に重要ではありません。実際には、スレッドプールとワークキューを使用します。AsyncTaskは、ハンドラーを使用して、メインアプリケーションスレッドで実行される作業の選択ビットを調整します(たとえば、進行状況の更新をユーザーに通知します)。

詳細については、それらの違いを参照してください。

ここに画像の説明を入力してください

于 2012-08-06T03:14:29.390 に答える
0

AsyncTasksとServicesはピアではありません。どちらかが他方を呼び出す可能性があり、それらの目的は異なります。ルシファーの答えに追加することがいくつかあります。

覚えておくべき重要なことは、プロセスがバックグラウンドにあり、サービスをホストし、強制終了された場合、そのサービスはある時点で生まれ変わるということです。これは、プロセスが強制終了されたときにプロセスで実行されている可能性のあるAsyncTaskには当てはまりません。これは、サービスで行われている作業が将来的に前進することが保証されていることを意味します(ただし、いつ保証されるわけではありません)。実行する必要のある作業がある場合は、サービスで実行することをお勧めします。

Service.onStartおよびService.onStartCommandの呼び出しは、プロセスのメインスレッドで行われます。これを長時間ブロックすると、同じ「アプリが応答しません」ダイアログが表示されます。結果として、AsyncTaskは、実際の作業を行うためにサービス内で使用するのに最適なものになる可能性があります。

UIに関連するものには、アクティビティから開始されたAsyncTasksを使用する傾向があります。これらは多くの場合、作業を必要とせず、将来簡単にやり直すことができるものです。たとえば、これはディスクから大量の画像を読み取ったり、Webサービスを呼び出して、ユーザーに通知があるかどうかを確認したりする場合があります。この作業は再度実行できます。プロセスが強制終了されたためにUIが破棄された場合は、とにかく作業を再度実行する必要があります。

一方、写真のグループをできるだけ早くWebにアップロードしたい場合は、1つ以上のAsyncTasksを使用して実行するサービスにこれをファームアウトします。これは私がやりたい仕事であり、中断された場合は再開したいです。サービスを使用する場合は、作業が完了したときにサービスが停止するようにIntentServiceの使用を検討してください。

于 2012-08-10T21:56:36.193 に答える