android - 此 java 代码是否会导致垃圾收集问题,如果是,我该如何预防?

标签 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);
        }
    }
}

最佳答案

你有一个非静态内部类。这意味着这个内部类已经有了对外部类的引用。因此,无需在构造函数中提供 MainActivity 参数。对该内部类的唯一引用是在调用 setOnClickListenerView 中。查看The Java Tutorials - Nested Classes获取更多信息。

至于你的垃圾收集器问题,每当 MainActivity 实例被垃圾收集时,它的 View 也会被收集,并且 OnClickListener。请记住,只有在 MainActivity 范围之外没有任何对 ViewOnClickListener 的引用时,这才是正确的。

关于android - 此 java 代码是否会导致垃圾收集问题,如果是,我该如何预防?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23860099/

相关文章:

java - Java ThreadPool中ThreadLocal值是否被GC?

java - JVM 中的确定性垃圾回收

java - 为什么 "A"或无输出只是此代码的可能输出,它也可能是 "AB"?

android - 如何将 Ionic 设置为默认呈现 iOS 样式?

安卓 : Unable to display multiple lines of text in Notification

android - 未校准的磁力计问题

Java 详细 GC 日志配置 - 未创建文件

android - 在将事件添加到 Android 日历之前检查事件是否存在

android - 有没有办法动态改变搜索栏的旋钮?

java - 匿名文件流重用描述符