android--弱引用來預防記憶體洩露
阿新 • • 發佈:2019-01-03
是否我們經常寫的程式碼無緣無故的提示我們記憶體洩露,或者是程式跑著跑著就掛了,其實這和我們寫的程式碼風格有關,以及寫的程式碼不規範,我們經常的更新UI操作,一般都是在Handler進行,但是我們一般沒有使用靜態static關鍵字修飾,以及沒有設定持有弱引用,導致,可能我們的activity已經destory了,但是,我們的Handler卻沒有關閉,這樣就可能會導致記憶體洩露.
———–不規範寫法————–
定義內部Handler類…
final Handler mHandler = new Handler{
public void handleMessage(android.os.Message msg) {
switch (msg.what){
case 1001:
//更新主介面UI操作
//如:更新介面卡等...
break;
}
其他地方呼叫:
如:
new Thread(){
public void run() {
Message msg = Message.obtain();
msg.what = 1001;
msg.obj = plan; mHandler.sendMessage(msg);
};
}.start();
———–嚴謹的寫法———–
1 靜態內部類,持有View物件的弱引用,方便JVM優先GC掉MyHandler物件…預防記憶體洩露…
static class MyHandler extends Handler{
SoftReference<TestHandler>mTestReference;//持有當前檢視的弱引用...
public MyHandler(TestHandler t) {
mTestReference = new SoftReference<TestHandler>(t);
}
@Override
public void handleMessage(Message msg) {
TestHandler test = mTestReference.get();
switch(msg.what)
{
case 1001:
//更新UI操作
break;
}
}
}
2 呼叫..
new Thread(){
public void run() {
MyHandler myHandler = new MyHandler(TestHandler.this);
Message msg = Message.obtain();
msg.what = 1001;
myHandler.sendMessage(msg);
};
}.start();
自己做個筆記,歡迎交流…