用handler
的時候
經常出現乙個警告
this handler class should be static or leaks might occur
這個handler
類應該被設成
static,
否則有可能記憶體洩漏
原因:
首先我們複習一下handler機制
訊息傳送到主線程,
新增到訊息佇列中,然後
looper
迴圈接收訊息
注意了,
在訊息佇列裡面排隊的訊息保持了對目標
handler
類的引用,
如果handler
是個內部類
,那麼它也會保持它所在的外部類
(一般就是
activity
或service等),
只要有訊息在佇列裡面,
那麼handler
就無法被**,
如果handler
不是static,
那麼用handler
的activity
或service
也不能被**
這就導致了記憶體洩漏
我們可以在handler
中保持乙個外部類的弱引用
來個static類,
繼承handler
public static class myhandler extends handler{
weakreference mouterclass;
myhandler(outerclass clz) {
mouterclass clz= new weakreference(clz);
@override
public void handlemessage(message msg) {
outerclass clz= mouterclass.get();
switch (msg.what) {
case what:
clz.method();
break;
defaule:
break;
這樣的話傳入的外部類就都是弱引用了
就可以用handler了
private myhandler handler = new myhandler(this);
handle 控制代碼
控制代碼是乙個32位的整數,實際上是windows在記憶體中維護的乙個物件記憶體實體地址列表的整數索引。因為windows的記憶體管理經常會將空閒物件的記憶體釋放掉,當需要訪問時再重新提交到物理記憶體,所以物件的實體地址是變化的,不允許程式直接通過實體地址來訪問物件。程式將想訪問的物件的控制代碼傳遞...
控制代碼 Handle
最近在學習儲存方面的知識,第一次接觸控制代碼這樣的專業詞彙,為了更好的理解其中含義,決定開始寫部落格,慢慢成長 什麼是控制代碼?在作業系統中存在著許多的核心物件,這些物件具有許多的屬性,其中位址是比較重要的一種。作業系統在操作這些物件時,如果傳遞的是位址本身,將會帶來一系列的隱患,比如呼叫位址資訊複...
控制代碼 Handle
介紹 控制代碼,是整個windows程式設計的基礎。乙個控制代碼是指使用的乙個唯一的整數值,即乙個四位元組長的數值,來標識應用程式中的不同物件和同類物件中的不同的例項,諸如,乙個視窗,按鈕,圖示,滾動條,輸出裝置,控制項或者檔案等。應用程式能夠通過控制代碼訪問相應的物件的資訊,但是控制代碼不是乙個指...