Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android hander如何避免內存洩露

android hander如何避免內存洩露

編輯:關於Android編程

在使用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.
*


* 構建防止內存洩露的handler
*


*/
public class CBHandler {
/**
* 防止handler對activity有隱式引用,匿名內部類不會對外部類有引用
*/
public static class UnleakHandler extends Handler {
private final WeakReference activity;

public UnleakHandler(CBActivity activity) {
this.activity = new WeakReference(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中處理即可。

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved