Android使用Thread加Handler實現計時與保持屏幕喚醒不熄滅
用到了兩個小知識點:一是使用Thread加Handler實現計時,二是控制屏幕喚醒不熄滅。
首先是計時,首先我使用單純的Handler來實現計時,代碼如下:
Handler handler = new Handler();
Runnable runnable = new Runnable() {
@Override
public void run() {
timeSec ++;
mTimeCount.setText("" + timeSec);
handler.postDelayed(this, 1000);
}
};但是這樣有個弊端,當我的主線程里有Thread.Sleep延時操作時,這個時候計時就會暫停。所以需要在另外一個Thread里來進行計時:
new Thread(new TimeThread()).start();final Handler handler = new Handler() {
public void handleMessage(Message msg) { switch (msg.what) { case 1: timeSec++; if (timeSec < 60) { // 1分鐘以下情況 mTimeCount.setText("總耗時:" + timeSec + "秒"); } else if (timeSec < 3600) { // 1小時以下情況 int minutes = timeSec / 60; int second = timeSec % 60; mTimeCount.setText("總耗時:" + minutes + "分" + second + "秒"); } else { int hours = timeSec / 3600; int minutes = (timeSec - hours * 3600) / 60; int second = timeSec % 60; mTimeCount.setText("總耗時:" + hours + "時" + minutes + "分" + second + "秒"); }} super.handleMessage(msg); } };</pre>這樣UI在阻塞時,雖然我們的mTimeCount這個TextView沒有實時更新,但是計時函數還是在進行的,當UI線程的Thread.Sleep()結束時,就會更新。 <p><br /></p>
下面看一下保持屏幕喚醒的邏輯:
private static PowerManager.WakeLock wakeLock;
public static void keepScreenOn(Context context, boolean on) { if (on) { PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); wakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE, "==KeepScreenOn=="); wakeLock.acquire(); } else { if (wakeLock != null) { wakeLock.release(); wakeLock = null; } } }
在應用destory的時候得把wakeLock給release掉:
@Override protected void onDestroy() { super.onDestroy(); keepScreenOn(Main.this, false); }