Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么接收器保留我的对象?_Java_Gson - Fatal编程技术网

Java 为什么接收器保留我的对象?

Java 为什么接收器保留我的对象?,java,gson,Java,Gson,每次我在MyObject的实例上调用myMethod时,都会分配一个新实例,并且在myMethod结束后不会进行GC 我已经为此挣扎了几个小时,我错过了什么 public class MyObject { public String tag = "myTag"; private BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onRecei

每次我在MyObject的实例上调用myMethod时,都会分配一个新实例,并且在myMethod结束后不会进行GC

我已经为此挣扎了几个小时,我错过了什么

public class MyObject {
    public String tag = "myTag";

    private BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            ...
        }
    };

    public MyObject() {
         LocalBroadcastManager.getInstance(context).registerReceiver(mReceiver,
            new IntentFilter("TEST_NOTIFICATION"));
    }

    public String serialize() {
        Gson gson = new Gson();
        return gson.toJson(this, MyObject.class);
    }

    public static MyObject deserialize(String jsonString) {
        Gson gson = new Gson();
        return gson.fromJson(jsonString, MyObject.class);
    }

    public void myMethod() {
        String serialized = this.serialize();
        Log.d("", "serialized: " + serialized);
        MyObject mis = MyObject.deserialize(serialized);
        Log.d("", "deserialized " + mis.tag);
    }
}

这与GSON无关。new BroadcastReceiver创建一个匿名类的实例,该类保留对其包含的MyObject的引用。LocalBroadcastManager反过来保留对mReceiver的引用。要解决此问题,请定义一个实现BroadcastReceiver的静态内部类或顶级类。静态内部类不保留对其封闭类的引用。

您如何知道它不是由GC收集的?@igreen-如果我持有一个MyObject实例并调用myMethod 5次,然后通过TEST_通知广播一个意图,它会被命中5次