[解決済み] ハンドラ vs AsyncTask vs スレッド [終了しました]。
質問
との違いに少し戸惑いました。
Handlers
,
AsyncTask
と
Threads
を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
の周辺にあるヘルパークラスとして設計されています。Thread
とHandler
であり、一般的なスレッドフレームワークを構成するものではありません。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
.
関連
-
[解決済み】Looper.prepare()を呼び出していないスレッド内でハンドラを作成できない。)
-
[解決済み】Android "ビュー階層を作成した元のスレッドだけが、そのビューに触れることができる"
-
[解決済み] 他のスレッドからGUIを更新するにはどうすればよいですか?
-
gitlab 設定エラー。リモートリポジトリから読み込めなかったか、ホストキーの検証に失敗しました。
-
WeChatとQQは、他のアプリのオープンリストに自分のアプリを追加し、ファイルパスを取得することができます
-
アプリの実行エラー。ターゲットデバイスが見つからない問題
-
[解決済み] Javaにおける "implements Runnable "と "extends Thread "の違いについて
-
[解決済み] プロセスとスレッドの違いは何ですか?
-
[解決済み] AsyncTaskのAndroidサンプル
-
[解決済み】AsyncTaskは本当に概念的に欠陥があるのか、それとも私が何かを見逃しているだけなのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
adb シェルがデバイスのオフラインを求めるプロンプトを表示する
-
AndroidでAttempt to invoke virtual method... on null object referenceの例外が発生する。
-
AndroidエミュレーターのADBサーバーがACKしない問題
-
telnet'が内部コマンドまたは外部コマンドとして認識されない 解決方法
-
アプリケーションがメインスレッドで過剰に作業している可能性があります。
-
エラー:未宣言の識別子(AS)の使用
-
Windowsのadbシェルでデータディレクトリにアクセスするとパーミッションが拒否される
-
Android Studioのgitの使用とgitの設定パス
-
[解決済み】複数のAsyncTasksを同時に実行することは不可能か?
-
[解決済み] アンドロイドのAsynctaskとThreadの比較