スレッド内にハンドラを作成できない Looper.prepare() を呼び出していないスレッド
8月9日にも、サービスでのサブスレッド作成時
RuntimeException: Looper.prepare() を呼び出していないスレッド Thread 内でハンドラを作成できない。
問題です。コードは以下の通りです。
new Thread(new Runnable() {
@Override
public void run() {
timer = new Timer(mTotalTime, TimeSetted.SECOND_TO_MILL);
timer.start();
Log.d(TAG,"Countdown start");
}
}).start();
に変更します。
new Thread(new Runnable() {
@Override
public void run() {
Looper.perpare();//add part
timer = new Timer(mTotalTime, TimeSetted.SECOND_TO_MILL);
timer.start();
Log.d(TAG,"Countdown start");
Looper.loop();//add part
}
}).start();
この後、アプリは普通に実行されます。つまり、具象ロジックの前後にLooper.perpare()とLooper.loop()のメソッドを追加しています。
エラーの原因を調べてみると、メインスレッド以外ではLooperが開いておらず、HandlerオブジェクトをLooperオブジェクトにバインドする必要があり、スレッドのメッセージループを作成するためにLooper.prepare()を呼び出し、メッセージループを動作させるためにLooper.loop()を呼び出すことが必要。
ここで問題です。
このサブスレッドにも、前のdoInBackgroundにも新しいハンドラは存在しないのに、なぜこのエラーが発生するのでしょうか?
使用しているCountdownTimerのソースコードを見たところ、start(),pause(),cancel()メソッドがメッセージとハンドラで実装されていて、サブスレッドでCountdownTimerを使用すると、デフォルトではLooperがバインドされていないのでエラーが発生するようです。
結論
1. スレッド内にハンドラを作成できない Looper.prepare()を呼んでいないスレッドは、通常、子スレッドでLooperがバインドされていないハンドラを使用している場合に発生する。ハンドラ文の前後にLooper.prepare()とLooper.loop()メソッドを追加するだけだ。
2 . 子スレッドを作成し、新しいハンドラオブジェクトを使用せずにAsyncTaskのdoInBackgroundを使用した場合、通常このエラーは発生しません。他のメソッドを呼び出すときにハンドラを使用することによるエラーを報告しています。
関連
-
[android.os.NetworkOnMainThreadException を解決してください。
-
シンボル 'AppCompatActivity' の解決策を解決できない
-
Android ARTランタイムのDalvik仮想マシンをシームレスに置き換えるプロセスの分析
-
Dalvik仮想マシンと学習プランの簡単な紹介
-
オーディオとビデオを再生するための資産と生でAndroidの練習
-
Android マルチメディア MediaPlayerの使用方法詳細
-
Android Studioの設定 Gradleの概要
-
android.content.res.Resources$NotFoundException: 文字列リソースID #0x1エラー
-
開始します。Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.
-
SQLiteReadOnlyDatabaseException: 読み取り専用のデータベースを書き込もうとした (コード 1032)
最新
-
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 のリストビューでアダプタを使用しているときに null オブジェクトの参照に対して仮想メソッド xxxxxxxx を呼び出そうとする問題が解決されました。
-
ERROR: x86 エミュレーションには現在ハードウェアアクセラレーションが必要です。
-
Android フロントカメラのビデオ録画に失敗しました (MediaRecorder: start failed: -19)
-
RuntimeException: Unable to start activity ComponentInfo{xxx}: java.lang.NullPoi Androidの開発において、アクティビティを開始できません。
-
指定された子にはすでに親がいます。まず、その子の親に対して removeView() をコールする必要があります。
-
Androidです。ViewPagerで現在のインターフェイスのFragmentを取得する
-
Android Studio精彩案例(七)《ToolBar使用详解<一>》
-
Android Studioのパッケージングプロセスとapk生成時のエラーについて
-
android AVD開始時刻エラー
-
React Native エラー。アプリケーション XXX は登録されていません ソリューション