了解 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 讨论了使用 onSaveInstanceStateonRestoreInstanceState 方法