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

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

PHP中文网
PHP中文网

认证0级讲师

répondre à tous(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

讲道理的话,显然可以这样用

但是!!! 请不要这样,楼上都说了,内存泄漏

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal