android - 静态方法中可以持有Activity对象吗
PHP中文网
PHP中文网 2017-04-17 17:29:34
0
7
698

静态方法中可以持有Activity对象吗,这么做不好吧
GC的销毁Activity时会不会因为静态方法持有引用而销毁不了啊

PHP中文网
PHP中文网

认证0级讲师

全部回覆(7)
大家讲道理

關於記憶體洩漏問題建議閱讀文章
Android記憶體外洩-全解析與處理方法

巴扎黑

題主你看一下下面這兩種情況就明白了。

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接收了這個引用。這個靜態成員變數會一直存在在進程中,這樣就會造成記憶體外洩。

洪涛

方法內的變數都是局部變量, 方法完了就不持有的。

黄舟

當然可以啊,沒感覺有什麼不好的

巴扎黑

補充一下樓上的回答,如果 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();
        }
    }
}
巴扎黑

建議樓上的弱引用方式,官方對於Handler的使用,也是這樣的方式

Peter_Zhu

講道理的話,顯然可以這樣用

但是! ! ! 請不要這樣,樓上都說了,記憶體洩漏

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板