亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

正確使用Handler

2019-11-09 13:44:40
字體:
來源:轉載
供稿:網友

下面是一個沒問題的Handler

public class DActivity extends AppCompatActivity {//    @Inject//    D d;        Handler mHandler = new Handler(new Handler.Callback() {        @Override        public boolean handleMessage(Message message) {            return false;        }    });    @Override    PRotected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_d);//        Diiii component = DaggerDiiii.builder().ddasfadfa(new Ddasfadfa()).build();//        component.injectD(this);            }}1,當代碼改成下面的時候就會出現問題

public class DActivity extends AppCompatActivity {//    @Inject//    D d;        Handler mHandler = new Handler(new Handler.Callback() {        @Override        public boolean handleMessage(Message message) {            return false;        }    });    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_d);//        Diiii component = DaggerDiiii.builder().ddasfadfa(new Ddasfadfa()).build();//        component.injectD(this);                mHandler.postDelayed(new Runnable() {            @Override            public void run() {                            }        },500*1000);    }}問題的原因在于:

當進入到這個界面后,反復的旋轉屏幕,導致這個頁面不斷的重新繪制,同時,如果持有很多的資源的話就會造成OOM;

分析原因:

一開始進入這個界面,初始化Handler,開啟延時任務,這時,屏幕旋轉,該activity需要被銷毀,卻發現,自己有個孩子還在做延遲任務,那么母親是肯定不能拋棄孩子的,所以,這個activity就銷毀不了了,當不斷的旋轉屏幕時,就會有很多個activity無法銷毀,如果持有很多的資源的話,那就更容易OOM了;

內部類new Handler(){}持有外部類Activity的引用

內部類new Runable(){}持有外部類Activity的引用

2,添加static(注意Handler和Runable都要加static)

public class DActivity extends AppCompatActivity {//    @Inject//    D d;        static Handler mHandler = new Handler(new Handler.Callback() {        @Override        public boolean handleMessage(Message message) {            return false;        }    });    static Runnable task = new Runnable() {        @Override        public void run() {                    }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_d);//        Diiii component = DaggerDiiii.builder().ddasfadfa(new Ddasfadfa()).build();//        component.injectD(this);                mHandler.postDelayed(task,500*1000);    }}分析:

這時Handler就不再是activity的孩子了,是靜態成員變量(是屬于類的,不屬于這個實例了),這時activity就可以被銷毀了,同時,Runable也用static修飾了;這樣就不會造成OOM了。

3,但是,如果在Handler或者在Runable中有引用外部類的成員,那也會OOM

public class DActivity extends AppCompatActivity {//    @Inject//    D d;
	ImageView iv;
	TextView tv;        static Handler mHandler = new Handler(new Handler.Callback() {        @Override        public boolean handleMessage(Message message) {
	    //tv.setText(“你好”);
	    //iv.set。。。。。。            return false;        }    });    static Runnable task = new Runnable() {        @Override        public void run() {            tv.setText(“你好”);
	    iv.set。。。。。。
	    finish;//引用了this        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_d);//        Diiii component = DaggerDiiii.builder().ddasfadfa(new Ddasfadfa()).build();//        component.injectD(this);                mHandler.postDelayed(task,500*1000);    }}如上,當Runable中需要引用imageview和textview時,這時也會造成內部類持有外部類的引用;如果Handler中有引用的話,也會造成內部類持有外部類的引用,解決辦法是:將tv、iv用靜態static修飾,這樣就不會持有其引用了;但是如果,Runable里面有tv、iv、bt等等,很多個引用呢?代碼改起來就很麻煩了;這時想到,造成OOM的問題在于Activity想銷毀時,這些成員變量tv、iv。。。卻還在被內部類引用著;也就是說,只要activity被銷毀了,就不讓他執行那些邏輯;所以就有下面的代碼:

publicclassMainActivity extends AppCompatActivity {

private Activity mActivity;

privatestaticfinal String TAG="stay4it";

@Override

protectedvoidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

init();

}

privatevoidinit(){

mActivity=this;

BetterHandler betterHandler = new BetterHandler(mActivity);

Message message=Message.obtain();

message.what=9527;

betterHandler.sendMessage(message);

betterHandler.postDelayed(new BetterRunnable(), 1000 * 20);

}

privatestaticclassBetterRunnable implements Runnable {

@Override

publicvoidrun() {

Log.i(TAG,"Runnable run()");

}

}

privatestaticclassBetterHandler extends Handler {

private WeakReference<Activity> activityWeakReference;

publicBetterHandler(Activity activity) {

activityWeakReference = new WeakReference<>(activity);

}

@Override

publicvoidhandleMessage(Message msg) {

super.handleMessage(msg);

if (activityWeakReference.get() != null) {

Log.i(TAG,"handle message");

}

}

}

}

就Activity需要用軟引用WeakReference包一下,不然會造成activity回收不了;如上面的代碼,當屏幕旋轉后,activity銷毀,activity為null,當handler執行任務時,activityWeakReference.get()為null,這樣就不會執行里面的代碼。當然這只是其中一種比較好的實現方式


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲人a成www在线影院| 欧美高清自拍一区| 精品无人区乱码1区2区3区在线| 欧美猛交ⅹxxx乱大交视频| 久久影视三级福利片| 国产美女精品免费电影| 久久国产精品影片| 91精品久久久久久久久久久久久久| 欧美重口另类videos人妖| 国产精品久久久久久久久影视| 国产精品高潮视频| 亚洲第一天堂av| 69av视频在线播放| 亚洲色无码播放| 久久精品影视伊人网| 亚洲男人天堂手机在线| 国产精品福利在线| 欧美高清在线视频观看不卡| 中文字幕欧美日韩va免费视频| 91av在线国产| 亚洲欧美日韩一区二区三区在线| 日本久久精品视频| 国产精品久久久久久久7电影| 精品高清一区二区三区| 色综合亚洲精品激情狠狠| 欧美成人亚洲成人| 久久久久www| 国产精品嫩草视频| 久久偷看各类女兵18女厕嘘嘘| 97久久久久久| 国产主播欧美精品| 亚洲美女在线视频| 日韩中文字幕第一页| 精品日本美女福利在线观看| 久久久亚洲成人| 精品一区二区三区三区| 91丝袜美腿美女视频网站| 欧美综合在线第二页| 色综合色综合久久综合频道88| 亚洲免费av电影| 亚洲春色另类小说| 久久久www成人免费精品张筱雨| 欧美日韩在线第一页| 国产成人在线亚洲欧美| 久久国产精品网站| 一区二区三区黄色| 久久久久久网站| 国产精品久久久精品| 日本精品久久久| 亚洲最大的成人网| 伊人久久男人天堂| 97视频网站入口| 国产精品无码专区在线观看| 欧美丝袜一区二区三区| 国产精品麻豆va在线播放| 中文字幕亚洲一区| 亚洲色图在线观看| 91在线免费观看网站| 亚洲欧美国产va在线影院| 欧美大片大片在线播放| 91国产在线精品| 亚洲美女www午夜| 国产精品ⅴa在线观看h| 欧美性开放视频| 中文字幕欧美在线| 国产精品伦子伦免费视频| 操日韩av在线电影| 亚洲第一区第一页| 国产成人综合av| 91在线免费视频| 538国产精品视频一区二区| 久久久久久91香蕉国产| 日韩一区二区精品视频| 久久精品一本久久99精品| 国产欧美日韩精品丝袜高跟鞋| 精品国产一区二区三区久久久| 欧美黄色片免费观看| 欧美性受xxxx白人性爽| 国内精久久久久久久久久人| 91欧美视频网站| 欧美人在线观看| 欧美激情视频一区二区| 日韩美女视频免费看| 在线观看亚洲视频| 97av在线视频免费播放| 亚洲综合国产精品| 国产精品永久免费在线| 欧美精品成人在线| 国产精品高清免费在线观看| 国产亚洲精品美女| 丝袜亚洲另类欧美重口| 最近2019年中文视频免费在线观看| 91天堂在线观看| 日本精品久久中文字幕佐佐木| 久久久91精品国产一区不卡| 欧美成人激情在线| 日韩在线视频线视频免费网站| 国内外成人免费激情在线视频网站| 色综合视频一区中文字幕| 国产精品久久久久av免费| 粉嫩av一区二区三区免费野| 亚洲精品资源美女情侣酒店| 欧美精品在线观看91| 色诱女教师一区二区三区| 2019av中文字幕| 成人美女免费网站视频| 亚洲午夜女主播在线直播| 91免费人成网站在线观看18| 日韩专区在线观看| 久久久999成人| 精品国产91久久久久久| 亚洲精品一区二区久| 国产精品一区=区| 亚洲欧美一区二区三区久久| 九九热视频这里只有精品| 国产精品久久久久久av福利| 精品成人69xx.xyz| 综合国产在线观看| 国产精品久久av| 国产精品免费电影| 欧美巨乳美女视频| 69久久夜色精品国产7777| 久久久久久亚洲精品| 日韩视频永久免费观看| 欧美视频中文在线看| 日韩欧美中文第一页| 精品国产一区久久久| 国产91精品高潮白浆喷水| 日韩激情片免费| 国产精品第一页在线| 国产91精品黑色丝袜高跟鞋| 亚洲一级片在线看| 欧美高清一级大片| 亚洲午夜小视频| 日韩中文字幕免费看| 综合激情国产一区| 欧美福利在线观看| 91精品国产综合久久香蕉最新版| 亚洲美女免费精品视频在线观看| 亚洲3p在线观看| 日韩免费中文字幕| 韩国三级电影久久久久久| 久久精品中文字幕一区| 亚洲黄色有码视频| 久久视频在线直播| 色久欧美在线视频观看| 亚洲欧美日韩精品久久亚洲区| 欧美中文在线观看| 91产国在线观看动作片喷水| 亚洲电影在线看| 国产乱人伦真实精品视频| 欧美最顶级的aⅴ艳星| 亚洲欧美日韩中文视频| 国产专区精品视频| 国产精品久久综合av爱欲tv| 亚洲欧美在线免费观看| 久久久视频在线| 成人在线免费观看视视频| 亚洲丝袜av一区| 精品亚洲永久免费精品| 久久天天躁狠狠躁夜夜躁| 亚洲嫩模很污视频| 日韩精品在线视频| 久久精品电影一区二区|