从Singleton对象引用Android Activity View

时间:2018-02-23 18:36:37

标签: android android-activity view singleton

假设我有一个Android活动(SecondaryActivity),该活动是从MainActivity开始的

SecondaryActivity包含文本视图TextView tv;

我有一个看起来像这样的Singleton:

public class Singleton {
    private static final Singleton instance = new Singleton();

    private static TextView secTextView;

    public static Singleton getInstance() {
        return instance;
    }

    public void setTV(TextView tv){
        secTextView = tv;
    }

    public TextView getTV(){
        return secTextView;
    }
}

在我的SecondaryActivity我这样做:

Singleton.getInstance().setTV(findViewById(R.id.sec_text_view));

现在想象一下,我在finish()内运行SecondaryActivity,因此程序状态返回MainActivity,从活动堆栈弹出SecondaryActivity

现在假设MainActivity运行

startActivity(new Intent(getApplicationContext, SecondaryActivity.class));

再次。

在此之后,如果我跑

Singelton.getInstance().getTV().setText("hello world"));

我们是否会引用当前位于Activity堆栈顶部的Activity中的TextView

另外,我的方法总体上有任何明显的问题吗?

1 个答案:

答案 0 :(得分:1)

  

我们将在当前活动中引用TextView   活动堆栈的顶部?

仅当您在第二项活动的Singleton.getInstance().setTV(findViewById(R.id.sec_text_view));方法中运行onCreate时才会这样做。

  

另外,我的方法总体上有任何明显的问题吗?

YES!您不应将视图/活动引用放在静态类/字段中。您正在创建内存泄漏。当你从SecondaryActivity调用完成时,你的单身人士仍然引用文本视图,并且活动不能被垃圾收集。这会泄漏内存。

再次启动SecondaryActivity时,会创建SecondaryActivity的新实例。除非您再次致电setTV,否则您的单身人士仍然会从已完成的活动中引用文本视图。

这是一个blog post,其中包含有关内存泄漏的更多信息。

如果您想简化视图绑定,请查看ButterKnife