android hander如何避免記憶體泄露,androidhander
在使用Android Handler的時候,可能會遇到編譯器給我們這樣的警告:
This Handler class should be static or leaks might occur
造成這個警告的原因是handler持有外層類(Activity等)的引用,同時訊息佇列中的Message對handler也持有引用,這樣就造成一些資源不能回,從而可能造成記憶體泄露。
解決這個警告的辦法即讓handler不持有外部類的引用,怎麼做到這一點呢,即將Handler設定為靜態內部類就行了,將外部類(Activity等)傳遞給Handler,在Handler中建立弱引用(WeakReference).
為了能夠使以後更好的使用Handler-Message機制,我這裡對其進行了封裝,使用方法見下。先看一下代碼。
CBHandler.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
package me.codeboy.android.common.component;
import android.os.Handler; import android.os.Message;
import java.lang.ref.WeakReference;
import me.codeboy.android.common.app.CBActivity;
/** * Created by yuedong.lyd on 6/7/15. * <p> * 構建防止記憶體泄露的handler * </p> */ public class CBHandler { /** * 防止handler對activity有隱式引用,匿名內部類不會對外部類有引用 */ public static class UnleakHandler extends Handler { private final WeakReference<CBActivity> activity;
public UnleakHandler(CBActivity activity) { this.activity = new WeakReference<CBActivity>(activity); }
@Override public void handleMessage(Message msg) { super.handleMessage(msg); if(activity.get() == null) { return; } activity.get().processMessage(msg); } } } |
CBActivity
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
package me.codeboy.android.common.app;
import android.app.Activity; import android.os.Bundle; import android.os.Message;
import me.codeboy.android.common.component.CBHandler;
/** * Created by yuedong.lyd on 6/8/15. */ public abstract class CBActivity extends Activity{ public CBHandler.UnleakHandler handler ;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); handler = new CBHandler.UnleakHandler(this); }
/** * 處理訊息 * @param msg */ public abstract void processMessage(Message msg); } |
在使用中,我們只需自己的Activity繼承CBActivity即可,在onCreate時自動建立UnleakHandler的執行個體handler,從CBHandler的代碼中我們也可以看出來,UnleakHandler自動將收到的訊息交給CBActivity中的processMessage進行處理。我們只需要在發送訊息的時候使用handler變數發送即可,處理在processHandler中處理即可。
更多文章請訪問小胖軒.