java - Android - 在应用程序级非 Activity 类中保存 Activity 引用

标签 java android

我有一个应用程序类,它包含 MyAdapter 类的引用:

public class MyApplication extends Application {

    ......

    private static MyAdapter sMyAdapter;

    public static MyAdapter getMyAdapter() {

        if (sMyAdapter == null) {
            sMyAdapter = new MyAdapter(this);
            MyApplication.setMyAdapter(sMyAdapter);
        }

        return sMyAdapter;
    }

    public static void setMyAdapter(MyAdapter myAdapter) {
        sMyAdapter = myAdapter;
    }

    ......
}

MyAdapter类是一个定制的android适配器类,应用程序Context被传递给Adapter。应用程序保留它的引用,因为它可以随时使用,直到应用程序仍在运行。

问题是,现在我需要适配器中的一个 Activity 上下文来在单击某个按钮时启动另一个 Activity,因为如果我使用应用程序上下文,我需要添加一个 Intent 标志 FLAG_ACTIVITY_NEW_TASK,但我不希望这样做,因为这样启动的新 Activity 将在新任务中运行。我尝试了很多更改启动模式和任务关联性,但要么出现新问题,要么 Activity 将在新任务中运行。

所以我想在 Adapter 类中保留一个显示按钮的 Activity 引用,为了避免内存泄漏,我想出了以下方法:

public class MyActivity extends Activity {

    ......

    @override
    public void onResume() {
        ......
        MyApplication.getMyAdapter().setActivity(this);
        ......
    }

    ......

    @override
    public void onDestroy() {
        ......
        MyApplication.getMyAdapter().setActivity(null);
        ......
    }
}

然后在 Adapter 类中,我将使用 Activity 引用来启动另一个 Activity。我测试过,效果很好,但问题是这是否可以避免内存泄漏,这是在 onResume 时保存 Activity 引用并在 onDestroy 时释放它的正确方法吗?还有其他合适的方法来实现我的目的吗?谢谢。

最佳答案

would this avoid memory leak

不是真的。您的 MyApplication 对象仍将保留对适配器及其所有“内容”的引用(进一步引用)。

是的,您已经摆脱了保留被破坏的Activity,并且您可能觉得保留适配器是可以的,因为您“无论如何都会再次需要它”,但这整个构造仍然是一个可怕的 code smell当您进一步开发时,肯定会引入新的内存泄漏和其他问题。 从逻辑上讲,此适配器是 Activity 的一部分,并且随着 Activity“消亡”,适配器也应该消亡。

我确信您认为您的应用程序需要该适配器是有原因的,因此我会发布另一个问题,询问“如何在应用程序不知道我的适配器的情况下实现 soandso”。

关于java - Android - 在应用程序级非 Activity 类中保存 Activity 引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46135661/

相关文章:

java - virtuoso-opensource : using jenaprovider, 如何从文件而不是从 URL 读取数据?

java - 输入/输出流和普通的读写器有什么区别,它们的类型有什么区别?

android - 关于泛型导致 ClassCastException LinkedTreeMap 无法转换为 Any

android - 单元测试 JNI 调用

java - 在android中使用接近传感器-关闭屏幕

java - 如何将字符串转换为日历对象?

Android解密WRONG_FINAL_BLOCK_LENGTH(用Python加密的文件)

Android:具有不同项目的 ListView (优化)

java - 将字符串转换为颜色 int

java - 从外部类更改 TabbedPane 索引