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()custom でメソッドをオーバーライドし、そこでTextView呼び出しますstopTimer()

于 2013-06-06T17:51:35.057 に答える
0

2 番目のハンドラーを作成し、そのハンドラー内でstopTimer().

または、 を使用することもできますAsyncTaskstopTimer()次に、onPostExecute()メソッドでを呼び出すことができます

于 2013-06-06T17:46:38.180 に答える