137 Handler警告解決方法

2021-07-11 23:09:06 字數 1245 閱讀 3097

用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程式設計的基礎。乙個控制代碼是指使用的乙個唯一的整數值,即乙個四位元組長的數值,來標識應用程式中的不同物件和同類物件中的不同的例項,諸如,乙個視窗,按鈕,圖示,滾動條,輸出裝置,控制項或者檔案等。應用程式能夠通過控制代碼訪問相應的物件的資訊,但是控制代碼不是乙個指...