假设我有一个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
?
另外,我的方法总体上有任何明显的问题吗?
答案 0 :(得分:1)
我们将在当前活动中引用TextView 活动堆栈的顶部?
仅当您在第二项活动的Singleton.getInstance().setTV(findViewById(R.id.sec_text_view));
方法中运行onCreate
时才会这样做。
另外,我的方法总体上有任何明显的问题吗?
YES!您不应将视图/活动引用放在静态类/字段中。您正在创建内存泄漏。当你从SecondaryActivity
调用完成时,你的单身人士仍然引用文本视图,并且活动不能被垃圾收集。这会泄漏内存。
再次启动SecondaryActivity
时,会创建SecondaryActivity
的新实例。除非您再次致电setTV
,否则您的单身人士仍然会从已完成的活动中引用文本视图。
这是一个blog post,其中包含有关内存泄漏的更多信息。
如果您想简化视图绑定,请查看ButterKnife。