[解決済み】Looper.prepare()を呼び出していないスレッド内でハンドラを作成できない。)
2022-01-10 20:49:19
質問
は以下のようなコードです。
Toast toast = Toast.makeText(mContext, "Something", Toast.LENGTH_SHORT);
実行すると、エラーが発生します。
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
at android.os.Handler.<init>(Handler.java:121)
at android.widget.Toast.<init>(Toast.java:68)
at android.widget.Toast.makeText(Toast.java:231)
解決方法は?
ワーカスレッドから呼び出している。を呼び出す必要があります。
Toast.makeText()
(そしてUIを扱う他のほとんどの関数も) メインスレッド内から行います。例えば、ハンドラを使うことができます。
調べる UIスレッドとの通信 のドキュメントを参照してください。簡単に説明すると
// Set this up in the UI thread.
mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message message) {
// This is where you do your work in the UI thread.
// Your worker tells you in the message what to do.
}
};
void workerThread() {
// And this is how you call it from the worker thread:
Message message = mHandler.obtainMessage(command, parameter);
message.sendToTarget();
}
その他のオプション
を使うことができます。
Activity.runOnUiThread()
. を使えば簡単です。
Activity
:
@WorkerThread
void workerThread() {
myActivity.runOnUiThread(() -> {
// This is where your UI code goes.
}
}
また、メインのルーパーに投稿することもできます。これは
Context
.
@WorkerThread
void workerThread() {
ContextCompat.getMainExecutor(context).execute(() -> {
// This is where your UI code goes.
}
}
非推奨。
を使用することができます。 AsyncTask これは、バックグラウンドで実行されるほとんどのものに対してうまく機能します。このフックには、進行状況や完了を示すために呼び出すことができるものがあります。
便利ですが、正しく使用しないとコンテキストをリークする可能性があります。公式に非推奨とされているので、もう使わない方がいい。
関連
-
非常に詳細な2つのシェルコードの例
-
スプレッドシートに匹敵するオンライングリッドシステム。EditGrid
-
[解決済み】以下の追跡されていないワーキングツリーファイルは、マージによって上書きされますが、私は気にしません。
-
[解決済み】constで変数を初期化しようとすると「initializerの要素が定数でない」というエラーが発生する。
-
[解決済み】ファイルにデータを書き込むときにこのエラーが発生する理由
-
[解決済み】マージが終了していない(MERGE_HEADが存在する)。
-
[解決済み] MIPSのフェッチアドレスがワード境界にアライメントされていないため、.align 4を使用したが、まだうまくいかない
-
[解決済み】count()パラメータは配列かlaravelのcountableを実装したオブジェクトでなければならない。
-
[解決済み】ポインタと整数の比較を警告する
-
[解決済み】Heroku + node.jsのエラー(Webプロセスが起動後60秒以内に$PORTにバインドできなかった)。
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
ソフトウェアテスト手法の概要
-
[解決済み] 式は変更可能なlvalueでなければならない
-
[解決済み】gitが「Pull is not possible because you have unmerged files」と言うのはなぜですか?
-
[解決済み】c++のコンパイルエラーです。ISO C++はポインタと整数の比較を禁止しています。
-
[解決済み】なぜ「Pickle - EOFError.」が発生するのでしょうか?空のファイルを読むと「Ran out of input」と表示されるのはなぜですか?
-
[解決済み】例外:AAPT2エラー:詳細はログを確認してください。
-
[解決済み】Java JDK - doubleからintへの非可逆変換の可能性
-
[解決済み】ファイルにデータを書き込むときにこのエラーが発生する理由
-
[解決済み】マージが終了していない(MERGE_HEADが存在する)。
-
[解決済み】ウィンドウ階層にないビューを持つUIViewControllerでUIViewControllerを表示しようとする