从Singleton对象引用Android Activity View

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从Singleton对象引用Android Activity View相关的知识,希望对你有一定的参考价值。

假设我有一个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中引用TextView

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

答案

我们是否会在活动堆栈顶部的Activity中引用TextView?

只有你在第二次活动的Singleton.getInstance().setTV(findViewById(R.id.sec_text_view));方法中运行onCreate

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

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

当你再次启动SecondaryActivity时,会创建一个新的SecondaryActivity实例。除非你再次调用setTV,否则你的单身人士仍会从完成的活动中引用文本视图。

这是一个blog post,提供有关内存泄漏的更多信息。

如果你想简化视图绑定,你应该看看ButterKnife

以上是关于从Singleton对象引用Android Activity View的主要内容,如果未能解决你的问题,请参考以下文章

如何使 Android 的 Singleton 对象持久化

JS设计模式---单例(Singleton)模式

Android - Singleton Class仅在第二次刷新时更新

android中所有活动的单socket.IO连接

设计模式-单例(Singleton)

Android Dagger2,Singleton交叉组件