手機休眠引發的重大Bug

2021-09-11 13:21:33 字數 1451 閱讀 8415

for (;;) 

// do something

}複製**

looper迴圈中取訊息會呼叫messagequeue的next方法,接下來看next方法:

final long now = systemclock.uptimemillis();

// do something

if (msg != null) else else

msg.next = null;

if (debug) log.v(tag, "returning message: " + msg);

msg.markinuse();

return msg;}}

複製**

對於延遲訊息,有乙個處理的時間點(when屬性)。在取訊息時,會判斷訊息是否到期,就是使用當前時間now和訊息when屬性進行比較,這裡沒什麼問題,有問題的是獲取當前時間(now)的方法:systemclock.uptimemillis(),下面看原始碼如何描述這個方法的:

/**

* returns milliseconds since boot, not counting time spent in deep sleep.

** @return milliseconds of non-sleep uptime since boot.

*/@criticalnative

native public static long uptimemillis();

複製**

powermanager pm = (powermanager) context.getsystemservice(context.power_service);

if (pm != null)

//釋放鎖

if (wakelock != null)

複製**

**封裝:

/**

* 使用需要在androidmanifest檔案中新增許可權如下:

* "android.permission.wake_lock"/>

*/public class cpuwakelock

}powermanager pm = (powermanager) activity.getsystemservice(context.power_service);

if (pm != null)

return

false;

}/**

* 給cpu解鎖,使cpu可以休眠

*/public synchronized void unlock

() }

public boolean islock

() }

複製**

參考

android休眠機制

由於濫用void 引發的bug

我一向認為在寫 時,void 濫用是有問題的,在最近的一次 中,有類似這樣一段 1 int send void buff,unsigned long size 23 int xx func char buff,unsigned long size 4 int send unsigned char b...

乙個bug引發的感想

上周五,系統出現乙個bug。基本描述如下 b功能上傳乙個到 b路徑 a功能要獲取b路徑的,但是獲取路徑寫錯了,寫成了a路徑。線上突然出現此問題,訂單無法完成。該功能用到的頻率還比較大。無法馬上布版本。首先的想法想通過改資料來解決,但是發現不行。資料是動態的,不能改,也改不過來。其次的想法 新增b路徑...

乙個 passive 引發的bug

不是什麼很難的東西,權且做個記錄。首先說下背景,目前的專案中,需要同時繫結 wheel 和 scroll 事件。繫結 wheel,目的是開發 ctrl wheel 縮放頁面功能,此功能與瀏覽器本身的衝突,因此需要禁用滾輪原生功能,示意 window.addeventlistener wheel fu...