了解 android 文档:处理运行时片段 "should never pass an object tied to the activity"
Understanding android documentation: handling runtime fragments "should never pass an object tied to the activity"
我对编程还比较陌生,而且我在方向改变方面遇到了麻烦。如果有任何想法,我将不胜感激。
这是关于官方 android 文档的具体问题,请不要将此问题报告为重复问题,并向我展示一个通用的处理运行时线程。
阅读文档后,我不确定下面引用的部分。
我的问题:如果我有一个在 TextView 中显示当前值的计时器,这是否意味着我根本不应该使用 fragman 来保留对象?
还是仅仅意味着我应该将 fragmant 完全从 activity 中分离出来?
Android 文档:
Caution: While you can store any object, you should never pass an object that is tied to the Activity, such as a Drawable, an Adapter, a View or any other object that's associated with a Context. If you do, it will leak all the views and resources of the original activity instance. (Leaking resources means that your application maintains a hold on them and they cannot be garbage-collected, so lots of memory can be lost.)
https://developer.android.com/guide/topics/resources/runtime-changes.html#RetainingAnObject
背景资料:
我的应用程序:(几个)间隔计时器。
如果在运行时方向发生变化,我想保留计时器的显示。
起初我在表现形式中使用了一个 hacky 解决方案,但它导致了问题,所以想为什么不尝试彻底解决问题。
如果我不能完成它,那么很可能我会让用户决定她或他喜欢哪个方向,然后在计时器运行期间修复它。
很明显,您不应该在 Timer
中引用 TextView
。如果需要,您可以阅读有关内存泄漏的信息,但该引用给出了一个很好的理由... "your application maintains a hold on them and they cannot be garbage-collected, so lots of memory can be lost"
不过,您可以使用 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);
}
}
如果您需要处理方向变化,那么我相信 link 讨论了使用 onSaveInstanceState
和 onRestoreInstanceState
方法
我对编程还比较陌生,而且我在方向改变方面遇到了麻烦。如果有任何想法,我将不胜感激。
这是关于官方 android 文档的具体问题,请不要将此问题报告为重复问题,并向我展示一个通用的处理运行时线程。
阅读文档后,我不确定下面引用的部分。
我的问题:如果我有一个在 TextView 中显示当前值的计时器,这是否意味着我根本不应该使用 fragman 来保留对象?
还是仅仅意味着我应该将 fragmant 完全从 activity 中分离出来?
Android 文档:
Caution: While you can store any object, you should never pass an object that is tied to the Activity, such as a Drawable, an Adapter, a View or any other object that's associated with a Context. If you do, it will leak all the views and resources of the original activity instance. (Leaking resources means that your application maintains a hold on them and they cannot be garbage-collected, so lots of memory can be lost.)
https://developer.android.com/guide/topics/resources/runtime-changes.html#RetainingAnObject
背景资料:
我的应用程序:(几个)间隔计时器。
如果在运行时方向发生变化,我想保留计时器的显示。
起初我在表现形式中使用了一个 hacky 解决方案,但它导致了问题,所以想为什么不尝试彻底解决问题。
如果我不能完成它,那么很可能我会让用户决定她或他喜欢哪个方向,然后在计时器运行期间修复它。
很明显,您不应该在 Timer
中引用 TextView
。如果需要,您可以阅读有关内存泄漏的信息,但该引用给出了一个很好的理由... "your application maintains a hold on them and they cannot be garbage-collected, so lots of memory can be lost"
不过,您可以使用 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);
}
}
如果您需要处理方向变化,那么我相信 link 讨论了使用 onSaveInstanceState
和 onRestoreInstanceState
方法