我正在处理下面的代码,在内部类构造函数中链接的内部类引用似乎可能会导致持久对象引用并混淆垃圾收集器,我需要担心这里的上下文吗?是否有与 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);
}
}
}
最佳答案
你有一个非静态内部类。这意味着这个内部类已经有了对外部类的引用。因此,无需在构造函数中提供 MainActivity
参数。对该内部类的唯一引用是在调用 setOnClickListener
的 View
中。查看The Java Tutorials - Nested Classes获取更多信息。
至于你的垃圾收集器问题,每当 MainActivity
实例被垃圾收集时,它的 View
也会被收集,并且 OnClickListener
。请记住,只有在 MainActivity
范围之外没有任何对 View
或 OnClickListener
的引用时,这才是正确的。
关于android - 此 java 代码是否会导致垃圾收集问题,如果是,我该如何预防?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23860099/