2

我正在使用自定义的 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);
    };
};

}
4

2 回答 2

3

覆盖onDetachedFromWindow()您的自定义方法TextView,并stopTimer()在那里调用。

于 2013-06-06T17:51:35.057 回答
0

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

或者,您可以决定使用AsyncTask. 然后你可以stopTimer()onPostExecute()方法中调用

于 2013-06-06T17:46:38.180 回答