问题描述
静态方法中可以持有Activity对象吗,这么做不好吧GC的销毁Activity时会不会因为静态方法持有引用而销毁不了啊
问题解答
回答1:关于内存泄漏问题建议阅读文章Android内存泄露——全解析和处理办法
回答2:题主你看一下下面这两种情况就明白了。
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接收了这个引用。这个静态成员变量会一直存在在进程中,这样就会造成内存泄露。
回答3:方法内的变量都是局部变量, 方法完了就不持有的。
回答4:当然可以啊,没感觉有什么不好的
回答5:补充一下楼上的回答,如果 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();} }}回答6:
建议楼上的弱引用方式,官方对于Handler的使用,也是这样的方式
回答7:讲道理的话,显然可以这样用
但是!!! 请不要这样,楼上都说了,内存泄漏