如何連續刷新TextView,防止線程阻塞

因爲設計遊戲時,有一個需要每秒刷新50次的TextView.一開始用的是遊戲線程調handler刷新UI的TextView,結果造成了線程阻塞.但是我又不想使用SurfaceView.查了兩天,最後選用了以下辦法:
1.繼承TextView
2.在新的類內部刷新視圖


代碼:

package com.example.textsview;

import android.content.Context;
import android.os.Handler;
import android.os.SystemClock;
import android.util.AttributeSet;
import android.widget.TextView;

public class TextSView extends TextView {
	/** 時間步 */
	public static final float TIME_STEP = 1f / 50f;

	private Runnable mTicker;
	private Handler mHandler;

	private boolean mTickerStopped = false;

	private int count = 1;

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

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

	@Override
	protected void onAttachedToWindow() {
		mTickerStopped = false;
		super.onAttachedToWindow();
		mHandler = new Handler();

		/**
		 * requests a tick on the next hard-second boundary
		 */
		mTicker = new Runnable() {
			public void run() {
				if (mTickerStopped) {
					return;
				}

				setText("count:" + count++);
				invalidate();

				long next = SystemClock.uptimeMillis() + (long) (TIME_STEP * 1000);
				mHandler.postAtTime(mTicker, next);
			}
		};
		mTicker.run();
	}

	@Override
	protected void onDetachedFromWindow() {
		super.onDetachedFromWindow();
		mTickerStopped = true;
	}
}

以上代碼參考Android自帶的DigitalClock類,更詳細的代碼可以看DigitalClock.


最後感謝liarzn.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章