Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android-在应用程序级非活动类中保留活动引用_Java_Android - Fatal编程技术网

Java Android-在应用程序级非活动类中保留活动引用

Java Android-在应用程序级非活动类中保留活动引用,java,android,Java,Android,我有一个应用程序类,它包含MyAdapter类的引用: public class MyApplication extends Application { ...... private static MyAdapter sMyAdapter; public static MyAdapter getMyAdapter() { if (sMyAdapter == null) { sMyAdapter = new MyAdapter

我有一个应用程序类,它包含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适配器类,应用程序上下文被传递给适配器。应用程序持有它的引用,因为在应用程序仍在运行之前,它可以随时使用

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

因此,我想保存一个活动引用,其中显示适配器类中的按钮,为了避免内存泄漏,我提出了以下建议:

public class MyActivity extends Activity {

    ......

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

    ......

    @override
    public void onDestroy() {
        ......
        MyApplication.getMyAdapter().setActivity(null);
        ......
    }
}
然后在Adapter类中,我将使用Activity引用启动另一个活动。我进行了测试,这很好,但问题是,这会避免内存泄漏吗?这是在恢复时保存活动引用并在onDestroy时释放它的正确方法吗?有没有其他合适的方法来达到我的目的?谢谢

这能避免内存泄漏吗

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

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

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

这能避免内存泄漏吗

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

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


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

谢谢你的及时答复。我同意您的看法,适配器应该与活动的生命周期保持一致,但目前我可能需要保留逻辑。。。所以我的意思是将
MyApplication.getMyAdapter().setActivity(null)避免活动内存泄漏?@MaxW是的,会的。感谢您的及时回复。我同意您的看法,适配器应该与活动的生命周期保持一致,但目前我可能需要保留逻辑。。。所以我的意思是将
MyApplication.getMyAdapter().setActivity(null)避免活动的内存泄漏?@MaxW是的,会的。