静态方法中可以持有Activity对象吗,这么做不好吧
GC的销毁Activity时会不会因为静态方法持有引用而销毁不了啊
巴扎黑2017-04-17 17:31:34
題主你看一下下面這兩種情況就明白了。
public class A{
public static a(Activity activity){
// do something
}
}
public class B{
private static Activity mActivity;
public static b(Activity activity){
mActivity = activity;
// do something
}
}
A中的靜態方法a,傳入了一個Activity對象,然後方法結束,Activity的引用activity生命週期結束,這樣不會造成洩露,沒問題。
B中的靜態方法b,傳入一個Activity對象,然後B的成員變數mActivity接收了這個引用。這個靜態成員變數會一直存在在進程中,這樣就會造成記憶體外洩。
巴扎黑2017-04-17 17:31:34
補充一下樓上的回答,如果 class B 是一個靜態內部類,非要持有 activity 的引用的話,可以考慮弱引用。
static class B {
private WeakReference<Activirty> ref;
public void setRef(Activity activity) {
this.ref = new WeakReference<>(activity);
}
public void doSomething(){
if (ref.get() != null){
ref.get().doSomething();
}
}
}