搜索

首页  >  问答  >  正文

android - 静态方法中可以持有Activity对象吗

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

PHP中文网PHP中文网2772 天前697

全部回复(7)我来回复

  • 大家讲道理

    大家讲道理2017-04-17 17:31:34

    关于内存泄漏问题建议阅读文章
    Android内存泄露——全解析和处理办法

    回复
    0
  • 巴扎黑

    巴扎黑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接收了这个引用。这个静态成员变量会一直存在在进程中,这样就会造成内存泄露。

    回复
    0
  • PHP中文网

    PHP中文网2017-04-17 17:31:34

    方法内的变量都是局部变量, 方法完了就不持有的。

    回复
    0
  • 黄舟

    黄舟2017-04-17 17:31:34

    当然可以啊,没感觉有什么不好的

    回复
    0
  • 巴扎黑

    巴扎黑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();
            }
        }
    }

    回复
    0
  • 巴扎黑

    巴扎黑2017-04-17 17:31:34

    建议楼上的弱引用方式,官方对于Handler的使用,也是这样的方式

    回复
    0
  • 天蓬老师

    天蓬老师2017-04-17 17:31:34

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

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

    回复
    0
  • 取消回复