搜尋

首頁  >  問答  >  主體

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

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

PHP中文网PHP中文网2772 天前700

全部回覆(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
  • 取消回覆