在自定义TextView中停止Timer()

时间:2013-06-06 17:44:43

标签: android android-activity timer

我正在使用自定义TextView在ListView中频繁更新时间,这是正常工作。 问题是计时器不断重复其任务,但活动已完成。

请说明活动结束后如何停止计时器。

public class TextViewTimerUpdate extends TextView {

private TimerTask mTimerTask;
private Timer mTimer;
private CharSequence mRelativeTime;

public TextViewTimerUpdate(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public TextViewTimerUpdate(Context context) {
    super(context);
}

public TextViewTimerUpdate(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

private CharSequence mText;

public void setTextForTime(final CharSequence text) {
    mText = text;
    startTimer();
}

public void startTimer() {
    Logger.i("startTimer", "startTimer");

    stopTimer();
    mTimer = new Timer();
    mTimerTask = new TimerTask() {
        @Override
        public void run() {
            // postInvalidate();
            Logger.i("timer", "timer");
            Thread th = new Thread(new Runnable() {

                @Override
                public void run() {
                    Logger.i("thread", "thread");

                    mRelativeTime = DateUtils.getRelativeTimeSpanString(
                            Long.parseLong(mText + ""), 
                            System.currentTimeMillis()
                            , 0);

                    handler.sendEmptyMessage(0);
                }
            });
            th.run();
        }
    };
    mTimer.scheduleAtFixedRate(mTimerTask, 0, 8000);
}

    public void stopTimer() {

        if (mTimer != null) {
            mTimer.cancel();
            mTimer = null;
        }

    }

private void justSetText(CharSequence text) {
    Logger.e("justSetText", text + "");
    super.setText(text + "", null);
}

private Handler handler = new Handler() {

    public void handleMessage(android.os.Message msg) {
        justSetText(mRelativeTime);
    };
};

}

2 个答案:

答案 0 :(得分:3)

覆盖自定义onDetachedFromWindow()中的TextView方法,然后在其中调用stopTimer()

答案 1 :(得分:0)

您需要创建第二个处理程序并在该处理程序中调用stopTimer()

或者,您可以决定使用AsyncTask。然后,您可以在stopTimer()方法

中调用onPostExecute()