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适配器类,应用程序上下文传递给适配器。该应用程序保留了它的参考,因为它可以随时使用直到应用程序仍在运行。

问题是,现在我需要适配器中的活动上下文在单击某些按钮时启动另一个活动,因为如果我使用应用程序上下文,我需要添加一个Intent flag flag_activitivity_new_task,我不想这样做,因为那样开始的新活动将在一项新任务中运行。我尝试了更改的启动模式和任务障碍,但是出现了新问题,或者活动将在新任务中运行。

因此,我正在考虑举办一个活动参考,该参考显示适配器类中的按钮,并避免记忆泄漏,我想到了以下内容:

public class MyActivity extends Activity {
    ......
    @override
    public void onResume() {
        ......
        MyApplication.getMyAdapter().setActivity(this);
        ......
    }
    ......
    @override
    public void onDestroy() {
        ......
        MyApplication.getMyAdapter().setActivity(null);
        ......
    }
}

然后在适配器类中使用活动参考来启动另一个活动。我进行了测试,这很好,但是问题是,这是否会避免内存泄漏,这是在Onresume onDestroy时释放活动参考并释放活动参考的正确方法吗?还有其他体面的方法可以实现我的目标吗?谢谢。

这会避免内存泄漏

不是真的。您的 MyApplication对象仍将使用所有"内容"(进一步的参考)保留对适配器的引用。

是的,您已经摆脱了将被摧毁的Activity围绕在周围的地方,您可能会觉得可以保留适配器,因为您"无论如何都会再需要它",但整个构造仍然是可怕的代码气味和随着您进一步发展,将肯定会引入新的内存泄漏和其他问题。从逻辑上讲,此适配器是Activity的一部分,并且作为Activity'DIES',适配器也应。

我敢肯定,您认为您需要在应用程序上需要该适配器的原因,所以我会发布另一个问题,询问"我如何在不知道适配器的情况下实现Soandso"。

最新更新