这个java代码会导致垃圾收集问题,如果是这样,我该如何防止它们?

时间:2014-05-25 21:24:00

标签: android garbage-collection

我正在研究下面的代码,并且在内部类构造函数中链接的内部类引用似乎可能导致持久对象引用并混淆垃圾收集器,我是否需要在此处的上下文中担心这一点?是否有一个与C#IDisposable等效的java,我可以清除该链接?有没有更好的方法来引用内部类的父类的不同内部类?是否有比这里使用的内部类更好的结构?

package com.example.exampleapp.exampleappmodule;

import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {
    AccelerometerSensorListener a_sensor_listener;
    Button start_listener_button;

    @Override
    protected void onCreate (Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);        
        setContentView(R.layout.mainactivity_layout);

        start_listener_button = (Button) findViewById(R.id.buttonStartListener);
        start_listener_button.setOnClickListener(new StartListenerButtonListener(this));
    }

    public class AccelerometerSensorListener implements SensorEventListener {

        @Override
        public void onSensorChanged(SensorEvent sensorEvent) {
            //... process sensor data ...
        }

        @Override
        public void onAccuracyChanged(Sensor sensor, int i) { }
    }

    public class StartListenerButtonListener implements View.OnClickListener {
        MainActivity pma;
        SensorManager a_sensor_manager;
        Sensor a_sensor;

        public StartListenerButtonListener(MainActivity argMainActivity) {
            pma = argMainActivity;
        }

        @Override
        public void onClick(View view) {
            // ... get sensor manager and sensor and assign to appropriate class property objects ...
            a_sensor_manager.registerListener(pma.a_sensor_listener, a_sensor, SensorManager.SENSOR_DELAY_NORMAL);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

你有一个非静态的内部类。这意味着这个内部类已经引用了外部类。因此,在构造函数中提供MainActivity参数是不必要的。对此内部类的唯一引用是View,其中setOnClickListener被调用。查看The Java Tutorials - Nested Classes了解详情。

至于你的垃圾收集器问题,每当MainActivity实例被垃圾收集时,它的View也将被收集,OnClickListener也是如此。请注意,只有在View范围之外没有OnClickListenerMainActivity的任何引用时才会这样。