CountDownTimer:「Looper.prepare(と呼ばれていないスレッド内でハンドラを作成することはできません)」
-
25-09-2019 - |
質問
私は知っている「)Looper.prepare(呼び出されていないスレッド内のハンドラを作成することはできません」の一般的な問題は、以前に頼まれましたが、私はそれが、この場合に適用される方法を理解するのに苦労しています。
私は私が推測され、非UIスレッドで新しいCountDownTimerを構築しようとしていますが、このエラーの原因ですが、タイマーはメインスレッドで使用される必要があるであろう、なぜ私は本当に理解していません。それはニーズが非UIスレッドは、デフォルトではありませんルーパーを、持っているスレッドで実行することをコールバックハンドラを持っているように、私が見ることができるものから、それは見えます。このタイマーを構築することができ、私のUIスレッド上でいくつかの奇妙な方法で、私には間抜けに見えるその両方を行う)この非UIスレッドがルーパーまたは2を持っていることを確認します)1:私のオプションがあるようです。誰かの助けが私には意味を理解することはできますか?
また、ルーパーとメッセージキューに光当てる任意の有用なリンクの誰も知っていますか?私は私が示されている確信しているように私は、それらをよく把握していません。ありがとうございます!
解決
タイマーは、UIスレッドである必要はありません。しかし、私の推測では、あなたがそのスレッド内のカウントダウン・カウントを表示するには、UIを更新しています。ゆうはそれを行うことはできません。
使用asynctaskとonProgressUpdate
でUIを更新
他のヒント
CountDownTimerのインスタンスは、UIスレッド上で作成する必要があります。
カスタムクラスのオブジェクトを持っていた場合:
public class MyTimer extends CountDownTimer{
public MyTimer(...){
super(duration,interval);
}
//... other code ...//
}
オブジェクトの構築は、UIスレッド上で実行する必要があります。
MyTimer mTimer = new MyTimer(...); //can throw RuntimeException
// with Looper.prepare() issue if
// caller isn't UI thread
は、複数のスレッドを作成し、タイマーを破壊している場合は、必ずそれはこのような何かを行うことによって、UIスレッド上で作成されています作ります
MyActivity.runOnUiThread( new Runnable(){
public void run(){
mTimer = new MyTimer(...);
}
});
が、上記のコードセグメントはmTimerあなたの活動およびクラスのメンバ変数への参照を必要とする方法を通知