我是编程的新手,方向改变时遇到麻烦。如有任何想法,我将不胜感激。
这是关于官方android文档的特定问题,请不要将此问题重复报告,并向我展示一个通用的处理运行时线程。
阅读文档后,我不确定下面引用的部分。
我的问题:如果我有一个在TextView中显示当前值的计时器,这是否意味着我根本不应该使用fragmant来保留该对象?
还是仅仅意味着我应该将fragmant与活动完全分开?
Android文档:
警告:虽然可以存储任何对象,但绝对不要传递与活动相关的对象,例如Drawable,Adapter,View或与Context相关联的任何其他对象。如果这样做,它将泄漏原始活动实例的所有视图和资源。(泄漏的资源意味着您的应用程序将保留它们,并且它们不能被垃圾回收,因此可能会丢失大量内存。)
https://developer.android.com/guide/topics/resources/runtime-changes.html#RetainingAnObject
背景资料:
我的应用程序:(几个)间隔计时器。
如果在运行时发生方向更改,我想保留计时器的显示。
首先,我在表现形式中使用了拙劣的解决方案,但它会导致问题,因此想出了为什么不尝试彻底解决问题的方法。
如果无法完成,那么极有可能让用户决定他或他喜欢的方向,然后在计时器运行时对其进行修复。
说白了,你不应该给一个参考TextView
的Timer
。如果愿意,您可以阅读内存泄漏的信息,但是该引用提供了一个很好的理由……“您的应用程序保留了这些泄漏,因此无法对其进行垃圾收集,因此可能会丢失大量内存”
不过,您可以使用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
方法
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句