我正在研究下面的代码,并且在内部类构造函数中链接的内部类引用似乎可能导致持久对象引用并混淆垃圾收集器,我是否需要在此处的上下文中担心这一点?是否有一个与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);
}
}
}
答案 0 :(得分:1)
你有一个非静态的内部类。这意味着这个内部类已经引用了外部类。因此,在构造函数中提供MainActivity
参数是不必要的。对此内部类的唯一引用是View
,其中setOnClickListener
被调用。查看The Java Tutorials - Nested Classes了解详情。
至于你的垃圾收集器问题,每当MainActivity
实例被垃圾收集时,它的View
也将被收集,OnClickListener
也是如此。请注意,只有在View
范围之外没有OnClickListener
或MainActivity
的任何引用时才会这样。