日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 互聯網 > 從Android Handler內部類到WeakReference的知識關聯

從Android Handler內部類到WeakReference的知識關聯

來源:程序員人生   發布時間:2014-11-03 08:21:33 閱讀次數:3770次

Handler:

普通用法:

Handler用于處理和從隊列MessageQueue中得到Message。1般我們要重寫Handler的handleMessage(Message msg){}方法來處理,以下代碼:

public class MainActivity extends Activity { private TextView textView; Handler normalHandler = new Handler(){ @Override public void handleMessage(Message msg) { switch (msg.what) { case 1: Log.i("test",textView.getText().toString()); break; default: break; } }; }; }



問題:

這個時候Handler會被Android SDK中Lint工具檢查正告你(左側那個黃色燈泡+嘆號):This Handler class should be static or leaks might occur 。

緣由:

This Handler class should be static:

(知識點1)為何靜態內部類可以解決這個問題呢?或說靜態內部類和非靜態內部類的區分是甚么?

舉例:class A{int a; static int b class B{}  static class C{} }  (A是外部類,B非靜態內部類,C靜態內部類,a普通字段,b靜態字段)

1)B非靜態內部類:

可以訪問A.a和A.b,也就是外部的屬性都能方位。由于B隱式的持有A類對象的援用,相當于A的屬性

2)C靜態內部類:

C只可以訪問A.b,不可以方位A.a。為何?由于C不含有A的援用,它和A類是同1個級別,只不過寫到了A類的內部。

本例緣由:

Handler匿名內部類,隱式的持有了外部類Activity的援用(這就是為何你能在handleMessage()中調用MainActivity中TextView等的屬性)。--->而以后調

Message message = normalHandler.obtainMessage();
normalHandler.sendMessageAtTime(message , 100*1000);

得到的message中又含有這個Handler的援用(可以看源碼)。

在100秒后message被履行,這期間message被放在MessageQueue中,MessageQueue在Looper中,Looper是線程的本地變量。

也就是說MainActivity即便生命周期走完了也不會垃圾回收,為何?由于Java的垃圾回收機制,就是看1個對象有無被援用(從線程中的主要對象開始,對象之間的援用構成網狀結構,如果有類的對象不在這張網上,就證明它沒被援用。這就是數據結構中圖的遍歷,甚么連通子圖,非連通子圖)。而本文中1個MainActivity被Handler持有援用,Handler被Message持有援用,Message被MessageQueue持有援用,MessageQueue被Looper持有援用,Looper為線程本地變量,線程不被摧毀,它就不會被燒毀。

所以即使用戶已切換、退出到別的Activity,MainActivity占有的內存仍舊不會被釋放。


解決方案:

打破援用鏈:

1.Message在100秒后被處理,以后回收Message,然后回收MainActivity。(所以是實際上,你只要不發很長時間的Message也不會有甚么問題)

2.使Handler不持有MainActivity的援用,用弱援用WeakReference:(簡單講,就是只有WeakReference援用的對象,垃圾回收將回收該對象,以后再另寫1篇援用的文章吧)


正常代碼:

MyHandler handler = new MyHandler(this); public static class MyHandler extends Handler { private WeakReference<MainActivity> reference; public MyHandler(MainActivity activity) { reference = new WeakReference<MainActivity>(activity); } @Override public void handleMessage(Message msg) { switch (msg.what) { case 1: Log.i("test",textView.getText().toString()); break; default: break; } } }



生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 99日在线视频 | 精品久久久久久久久久中出 | 91精品国产综合久久久久久丝袜 | 亚洲最大av在线 | 成人天堂 | 999视频| 涩视频| 久久国产精品久久久久久 | 久久久免费观看视频 | 国产精品久久久久久久久久久久冷 | 亚洲欧美日韩综合 | 国产视频a | 精品视频免费在线播放 | 久久久久久一 | 99精品国产高清一区二区麻豆 | 久久两性网 | 九九九久久久久久久 | 自拍偷拍视频网站 | 欧美日韩免费视频 | 亚洲一区在线看 | 精品久久网 | 精品2区 | 国产精品岛国久久久久久 | 欧美一级片在线看 | 日韩精品视频免费观看 | 欧美日韩成人在线 | 欧美在线免费 | 麻豆精品久久久 | 免费成人黄色网址 | 一本久久精品一区二区 | 欧美久 | 亚洲五月婷婷 | a级毛片免费网站 | 变态 另类 欧美 大码 日韩 | 一级片网址 | 视频一区在线播放 | 欧美日韩精品一区 | 国产成人精品a视频一区www | 国产精品久久久久久妇女 | 国内精品久久久久久久影视简单 | 中文字幕一区二区三区在线播放 |