[解決済み] Androidです。Handler()とThreadはいつ使い分ける?
2022-05-13 17:31:08
質問
何かを実行する必要があるとき
非同期に
のような
長く続くタスク
や、ネットワークを使うロジックなど、何らかの理由によるものです。
を起動すると
新しいスレッド
を起動して実行すれば問題なく動作します。
スレッドを作成する
ハンドラ
を作成し、それを実行しても同様に動作します。
何が違うのでしょうか?それぞれをいつ使うべきですか?
また
Handler
でなく
Thread
?
PS.
- この質問のために、無視しましょう。
AsyncTask
.
-
Handler().postDelayed
ユースケースは私にとって明確です。この質問のために、私がタスクをすぐに開始する必要があると仮定しましょう。
どのように解決するのですか?
もしあなたがしていることが重いことであれば、スレッドで行う必要があります。明示的に独自のスレッドで開始しない場合、メイン (UI) スレッドで実行され、ユーザーによってインターフェイスの応答が遅くなったり、揺れたりすることがあります。
興味深いことに、スレッドを使用しているとき、開始する作業スレッドとメインスレッドの間の通信手段としてハンドラも使用すると便利なことがよくあります。
典型的なスレッド/ハンドラの相互作用は次のようなものです。
Handler h = new Handler(){
@Override
public void handleMessage(Message msg){
if(msg.what == 0){
updateUI();
}else{
showErrorDialog();
}
}
};
Thread t = new Thread() {
@Override
public void run(){
doSomeWork();
if(succeed){
//we can't update the UI from here so we'll signal our handler and it will do it for us.
h.sendEmptyMessage(0);
}else{
h.sendEmptyMessage(1);
}
}
};
しかし一般的には、長時間の実行や非常に集中的な作業(ネットワーク、ファイルIO、重い演算など)を行う場合は、いつでもThreadを使用する必要があるということです。
関連
-
[解決済み】Looper.prepare()を呼び出していないスレッド内でハンドラを作成できない。)
-
[解決済み】Android "ビュー階層を作成した元のスレッドだけが、そのビューに触れることができる"
-
[解決済み] Androidのgravityとlayout_gravityの違いは何ですか?
-
android studioが "The activity must be exported or contain an intent-filter" と表示され実行される。
-
エラー:未宣言の識別子(AS)の使用
-
[解決済み] プロセスとスレッドの違いは何ですか?
-
[解決済み] Androidで現在の時刻と日付を取得する方法
-
[解決済み] ThreadLocal変数はいつ、どのように使用すればよいですか?
-
[解決済み】Android UserManager.isUserAGoat()の正しい使用例?)
-
[解決済み] main()が終了したとき、デタッチド・スレッドはどうなるのでしょうか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[android studio]com.android.ide.common.process.ProcessException: aaptの実行に失敗しました
-
GIF、Lottie、SVGA
-
Androidで発生した問題、解決策とヒント
-
Android: インポートモジュールエラー Android リソースのリンクに失敗しました
-
telnet'が内部コマンドまたは外部コマンドとして認識されない 解決方法
-
android block certificate validation CertPathValidatorException: 認証パスのトラストアンカーが見つかりません
-
repo: コマンドが見つかりません
-
アンドロイドのエリプサイズを使用する
-
android bluetooth--Bluetooth on、検索、ペアリング、接続
-
アンドロイドの遅延実行のいくつかの方法