0

実際、テキストビューに分と秒を表示するためのハンドラーを備えた別のタイマークラスを設計しました。私はそれをデバッグし、ハンドラーはハンドルを解放しますが、テキストビューは更新されません。これに関して私を助けてください。以下のタイマー クラスのコードにタグを付けています。前もって感謝します。

public class Timer
{
    private int _interval;
    public int getInterval()
    {
        return _interval;
    }
    public void setInterval(int delay)
    {
        _interval = delay;
    }
    private Handler handler;
    private Runnable _tickHandler;
    private Runnable delegate;
    private boolean ticking;
    public boolean getIsTicking()
    {
        return ticking;
    }
    public Timer(int interval)
    {
        _interval = interval;
        handler = new Handler();
    }
    public Timer(int interval, Runnable onTickHandler)
    {
        _interval = interval;
        setOnTickHandler(onTickHandler);
        handler = new Handler();
    }
    public void start(int interval, Runnable onTickHandler)
    {
        if (ticking) return;
        _interval = interval;
        setOnTickHandler(onTickHandler);
        handler.postDelayed(delegate, _interval);
        ticking = true;
    }
    public void start()
    {
        if (ticking) return;
        handler.postDelayed(delegate, _interval);
        ticking = true;
    }
    public void stop()
    {
        handler.removeCallbacks(delegate);
        ticking = false;
    }
    public void setOnTickHandler(Runnable onTickHandler)
    {
        if (onTickHandler == null)        return;
        _tickHandler = onTickHandler;
        delegate = new Runnable()
        {
            public void run()
            {
                if (_tickHandler == null) return;
                _tickHandler.run();
                handler.postDelayed(delegate, _interval);
            }
        }
        ;
    }
}

以下は、テキストビューの更新に使用しているコードです

Timer tmr = new Timer(100,new Runnable()
{
    public void run()
    {
        long millis = System.currentTimeMillis() - mStartTime;
        int seconds = (int) (millis / 1000);
        int minutes = seconds / 60;
        seconds    = seconds % 60;
        lblDevOnOff.setText("");
        lblDevOnOff.setText(String.format("%d:%02d", minutes,seconds));
    }
}
);
tmr.start();
4

2 に答える 2

1

このコードを入れて

handlerまたはrunOnUIThread()このようなもの

runOnUIThread(new Runnable(){

public void run(){

lblDevOnOff.setText("");
lblDevOnOff.setText(String.format("%d:%02d", minutes,seconds));
}
})

UIに関連するものはすべてUIスレッドでのみ実行する必要があるため、これを行う必要があります...

于 2012-04-26T11:38:11.570 に答える
0

ええ、これはAndroid Dev Guideからのものです:

したがって、Android のシングル スレッド モデルには 2 つのルールがあります。

  • UI スレッドをブロックしない
  • UI スレッドの外部から Android UI ツールキットにアクセスしないでください。
于 2012-04-26T11:45:12.770 に答える