9

これは何度も尋ねられた質問です。しかし、答えが見つからなかったことがあります。ですから誰かが私に光を当てることができれば幸いです。Android AsyncTask vsスレッド+ハンドラvs rxjava

AsyncTaskとThreadは、ANRの問題を回避するためにバックグラウンドタスクを実行するためのオプションです。 asynctaskは短時間実行タスクにのみ使用し、スレッドは長期実行タスクに使用することをお勧めします。 asynctaskを長いタスクに使用してはならない理由は、asynctaskによって引き起こされる可能性のあるリークについてよく知られています。これは、アクティビティが破棄された後に実行を継続する可能性があるためです。それは説得力があります。ただし、その他の質問もあります。

  1. スレッドはアクティビティライフサイクルからも独立していませんか?したがって、asynctaskのリスクはスレッドにも適用できます。なぜ、スレッドは長時間実行されるタスクに適していますか?
  2. asynctaskのリスクは、アクティビティで使用する場合にのみ適用されます。 IntentServiceが作業完了後に停止してからIntentServiceを使用しないでサービスを使用する場合、サービスが停止したときにasyntaskをキャンセルすることが保証されている限り、長期実行タスクに使用できますか?それはサービスでasynctaskを使用するのが自由に危険なことを意味しないのですか?
  3. 私はしばらくの間、rxjavaで遊んだことがあり、本当に好きです。それはスレッドを心配する必要性を排除します(サブスクライブするスレッドを決定し、放出されたデータを観察する必要はありません)。 rxjava(改造のような他のライブラリと組み合わせて)は、asynctaskとthreadの完全な置き換えに思えます。 rxjavaがasynctaskとスレッドが私が気づくべきことを達成できるものを達成できないという特定のケースがあるかどうか、私はそれらを完全に忘れることができるかどうか疑問に思っています。

おかげ

答えて

1

誰も返信しないので。私は自分の質問に答えています。

  1. AsyncTaskは(5秒程度)だけ短いタスクのために推奨される理由は、実行中のAsyncTaskをキャンセルする方法がないです。 AsyncTask.cancel(true)というメソッドがあり、これはonCancelled(Result result)を呼び出します。しかし、ドキュメントによれば、このメソッドは「cancel(boolean)が呼び出され、doInBackground(Object [])が終了した後にUIスレッドで実行されます。 (https://developer.android.com/reference/android/os/AsyncTask.html)。一方、ThreadThread.interrupt()で停止できます。
  2. AsyncTaskは、AsyncTaskのキャンセル制限があることを承知しており、AsyncTaskによってメモリリークの可能性があることを承知している場合は、Serviceの範囲内で実行してください。ワーカースレッドで既に実行されているIntentServiceにはAsyncTaskを使用する必要はありません。
  3. これは経験に基づいた質問です。私は完全な答えがないだろうと思う。私たちができることは、Rxを理解し、それを使用するのに適した場所を決定するための限界を認識していることです。私の開発作業では、問題なく、いつもRxJavaを使用しています。同じメモリリークの問題がRxJavaにも適用されることに注意してください。特定の質問hereの1つを見つけることができます。 RxJavaで漏れ/画面の回転を処理する方法については、Google検索で簡単に見つけることができます。
0

AsyncTaskとスレッド+ハンドラは、慎重に設計され、実装されていません。非同期実行のためのRxJava、Akkaおよび他のフレームワークは、より慎重に開発されたようです。

各テクノロジには制限があります。 AsyncTaskは、UI上で進行状況を表示する機能を持つ単一の並列タスク用です。ただし、アクティビティが再生成された場合(たとえば画面が回転しているため)、UIへの接続が失われます(この問題の解決策の1つはhttps://github.com/rfqu/AsyncConnectorです)。

Thread+Handlerは、処理するメッセージがない場合でもスレッドスタックのメモリを保持します。これにより、可能なスレッド数が制限されます。同様の機能を持つハンドラスレッドよりもはるかに多くのAkka actorsまたはRxJava Subscribersを持つことができます。

+0

答えをありがとう。だから、AsynctaskとThreadの代わりにrxjavaを使うのはどういう意味ですか?答えに「慎重に」という意味を明確にしてください。ありがとう –

関連する問題