1. ホーム
  2. android

[解決済み] ハンドラ vs AsyncTask vs スレッド [終了しました]。

2022-03-23 08:29:51

質問

との違いに少し戸惑いました。 Handlers , AsyncTaskThreads をAndroidで使用することができます。StackOverflowでかなりの数のブログやここでの質問を読みました。

Handler は、UIとの通信を行うためのバックグラウンドスレッドです。たとえば、プログレスバーの更新は Handler . ハンドラを使用すると、次のような利点があります。 MessagingQueues そのため、メッセージをスケジュールしたり、複数のUI要素を更新したり、タスクを繰り返したりすることができます。

AsyncTask は類似しており、実際、これらは Handler しかし、UIスレッドで実行されないので、データの取得、例えばウェブサービスの取得に適しています。後でUIと対話することができます。

Thread しかし、UI と対話することができず、より多くの "基本的な" スレッディングを提供し、すべての抽象化を逃すことになります。 AsyncTask .

しかし、ソケット接続をサービスで実行させたいと考えています。これはハンドラで実行すべきなのか、スレッドで実行すべきなのか、はたまた AsyncTask ? UIインタラクションは全く必要ありません。パフォーマンス上、どちらを使ってもいいのでしょうか?

一方 ドキュメント は大幅に改善されました。

解決方法は?

のチュートリアルのように Handler、AsyncTask、Loaderを使ったAndroidのバックグラウンド処理 には、Vogellaのサイトにこう書かれています。

その Handler クラスはスレッドに登録するために使用され、このスレッドにデータを送信するためのシンプルなチャネルを提供します。

AsyncTask クラスは、バックグラウンドプロセスの生成とメインスレッドとの同期をカプセル化します。また、実行中のタスクの進捗状況を報告することもサポートしています。

そして Thread は、基本的にマルチスレッドの核となる要素で、開発者は以下のようなデメリットを持って使用することができます。

Javaスレッドを使用する場合、以下の要件を処理する必要があります。 を独自のコードで作成します。

  • ユーザーインターフェースに結果をポストバックする場合のメインスレッドとの同期
  • スレッドをキャンセルするためのデフォルトがない
  • スレッドプーリングのデフォルトなし
  • Androidの設定変更に対応するためのデフォルトがない

また AsyncTask のように Android Developer's Reference と言っています。

AsyncTask は、UIスレッドを適切かつ容易に使用できるようにします。このクラスは バックグラウンドでの操作と結果の公開をUI上で行うことができます。 スレッドやハンドラを操作する必要がありません。

AsyncTask の周辺にあるヘルパークラスとして設計されています。 ThreadHandler であり、一般的なスレッドフレームワークを構成するものではありません。AsyncTasks は、理想的には短時間(数秒)の操作に使用されるべきです。 を使用します。) スレッドを長時間稼働させる必要がある場合。 が提供するさまざまな API を使用することを強くお勧めします。 java.util.concurrentパッケージのExecutor、ThreadPoolExecutor、そして フューチャータスク

2015年5月更新 を発見しました。 優れた連続講義 このトピックをカバーしています。

これがGoogle検索です。 Douglas Schmidt lecture android concurrency and synchronisation (ダグラス・シュミット レクチャー アンド シンクロナイゼーション)

の動画です。 YouTubeで第1回目の講義を公開

これらはすべて CS 282(2013年)。Android向けシステムプログラミング から バンダービルト大学 . 以下は YouTubeプレイリスト

ダグラス・シュミットは優秀な講師のようだ

重要です。 を使用することを検討している段階であれば、そのようなことはありません。 AsyncTask を使用してスレッド化の問題を解決するには、まず チェックアウト ReactiveX/RxAndroid を使えば、より適切なプログラミングパターンが得られるかもしれません。概要を知るための非常に良いリソースは 例で学ぶRxJava 2 for Android .