【问题标题】:Referencing Android Activity View from a Singleton object从 Singleton 对象引用 Android Activity 视图
【发布时间】:2018-08-03 21:19:30
【问题描述】:

假设我有一个 Android Activity (SecondaryActivity),它从 MainActivity 开始

SecondaryActivity 包含一个文本视图,TextView tv;

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

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));

现在想象一下,我稍后在 SecondaryActivity 中运行 finish(),因此程序状态返回到 MainActivity,将 SecondaryActivity 从 Activity 堆栈中弹出。

现在想象MainActivity 运行

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

再一次。

在这之后,如果我运行

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

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

另外,我的方法一般有什么明显的问题吗?

【问题讨论】:

    标签: android android-activity view singleton


    【解决方案1】:

    我们会在当前的 Activity 中引用 TextView Activity 堆栈的顶部?

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

    另外,我的方法一般有什么明显的问题吗?

    是的!您不应将视图/活动引用放在静态类/字段中。您正在创建内存泄漏。当您从SecondaryActivity 调用完成时,您的单例仍会引用文本视图,并且无法对活动进行垃圾收集。这会泄漏内存。

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

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

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

    【讨论】:

    • 为了帮助解决泄漏,您可以将静态引用设置为 null。
    • @dazza5000 那么单身的意义何在?视图属于活动范围。
    • 我不建议使用这样的单例,但如果你选择这样做,我建议一种方法来帮助解决内存泄漏。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 2019-02-09
    相关资源
    最近更新 更多