7

「Looper.prepare() を呼び出していないスレッド内でハンドラーを作成できない」という一般的な問題が以前に尋ねられたことは知っていますが、この場合にどのように適用されるかを理解するのに苦労しています。

UI 以外のスレッドで新しい CountDownTimer を作成しようとしていますが、これがこのエラーの原因だと思いますが、メイン スレッドでタイマーを使用する必要がある理由がよくわかりません。私が見る限り、ルーパーを持つスレッドで実行する必要があるコールバック ハンドラーがあるように見えますが、非 UI スレッドにはデフォルトではありません。私のオプションは次のとおりです。1)この非UIスレッドにルーパーを持たせるか、2)UIスレッドにこのタイマーを構築できる奇妙なメソッドを作成します。どちらも私にはばかげているようです。誰かがその意味を理解するのを手伝ってくれますか?

また、Looper と MessageQueue に光を当てる便利なリンクを知っている人はいますか? 私が示したと確信しているように、私はそれらをよく把握していません。ありがとうございました!

4

2 に答える 2

4

UI スレッドで CountDownTimer のインスタンスを作成する必要があります。

カスタム クラス オブジェクトがある場合:

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(...);
     }
});

ただし、上記のコード セグメントでは、Activity とクラス メンバー変数 mTimer への参照が必要であることに注意してください。

于 2014-09-09T22:17:01.603 に答える
2

タイマーは UI スレッド内にある必要はありません。しかし、そのスレッドでカウントダウン カウントを表示するように UI を更新していると思います。ユウにはそれができない。

asynctask を使用して UI を更新するonProgressUpdate

于 2010-10-24T02:58:41.877 に答える