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