我对编程比较陌生,我在改变方向时遇到了麻烦。我会感激任何想法 这是关于官方android文档的具体问题,请不要将此问题报告为重复,并向我显示通用处理运行时线程。
阅读完文档后,我不确定下面引用的部分。
我的问题:如果我有一个显示TextView中当前值的计时器,这是否意味着我不应该使用fragmant来保留该对象?
或者它只是意味着我应该完全从活动中分离出碎片?
Android文档:
警告:虽然您可以存储任何对象,但是您永远不应该传递与Activity绑定的对象,例如Drawable,Adapter,View或与Context关联的任何其他对象。如果这样做,它将泄漏原始活动实例的所有视图和资源。 (资源泄漏意味着您的应用程序会保留它们并且不能进行垃圾回收,因此可能会丢失大量内存。)
https://developer.android.com/guide/topics/resources/runtime-changes.html#RetainingAnObject
背景资料:
我的应用程序:(几个)间隔计时器 如果在运行期间发生方向更改,我想保留计时器的显示。
我首先在表现中使用了一个hacky解决方案,但它会导致问题,因此想到为什么不尝试干净地解决问题。
如果我不能完成它,那么很可能我会让用户决定她或他更喜欢哪个方向,然后在计时器的运行期间修复它。
答案 0 :(得分:0)
显然,您不应该引用TextView
中的Timer
。如果你愿意的话,你可以阅读内存泄漏,但是这个引用给出了一个很好的理由......"你的应用程序保留了它们并且它们不能被垃圾收集,因此大量内存可能丢失&#34 ;
但是,您可以使用Timer中的接口。
public class MyTimer extends Timer {
public interface TextChangeListener {
public void onTextChange(String text);
}
private MyTimer.TextChangeListener listener;
public MyTimer(TextChangeListener listener) {
this.listener = listener;
}
@Override
public void schedule(...) { // TODO: Pick which one to override
super.schedule(...); // TODO: Use the same params
if (listener != null) {
listener.onTextChange("Some text");
}
}
}
然后,只需实现该界面并启动计时器
public class MainActivity extends AppCompatActivity
implements MyTimer.TextChangeListener {
private TextView textView;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.activity_main);
// TODO: textView = findViewById(R.id.textView);
Timer t = new MyTimer(this); // 'this' refers to the interface
// TODO: Start timer
}
public void onTextChange(String text) {
textView.setText(text);
}
}
如果您需要处理方向更改,我相信该链接讨论了如何使用onSaveInstanceState
和onRestoreInstanceState
方法