从Singleton对象引用Android Activity View

问题描述 投票:0回答:1

假设我有一个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

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

android android-activity view singleton
1个回答
1
投票

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

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

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.