Android - 在应用程序级非活动类

时间:2017-09-09 22:27:01

标签: 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时单击某个按钮因为如果我使用应用程序上下文我需要添加一个我不想要的Intent标志FLAG_ACTIVITY_NEW_TASK因为那样正在启动的新活动将在新任务中运行。我尝试了很多改变启动模式和taskAffinity但是出现了新问题或者活动将在新任务中运行。

所以我想拿一个Activity参考来显示Adapter类中的按钮,为了避免内存泄漏,我想出了以下内容:

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时释放它的正确方法吗?有没有其他体面的方式来实现我的目的?感谢。

1 个答案:

答案 0 :(得分:0)

  

这会避免内存泄漏

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

是的,你已经摆脱了保持被破坏的Activity,你可能觉得保持适配器是可以的,因为你'无论如何'将再次需要它,仍然整个构造是一个可怕的code smell并且肯定会在你进一步发展时引入新的内存泄漏和其他问题。 从逻辑上讲,这个适配器是Activity的一部分,当Activity'死'时,适配器也是如此。

我确信你有一个理由感觉你需要在你的应用程序上使用那个适配器,所以我会发布另一个问题'如果我的应用程序不知道我的适配器,我怎样才能实现soandso'。