gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:09:53 25 4
gpt4 key购买 nike

我有一个应用程序类,它包含 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com