理解android文档:处理运行时片段"永远不应该传递与活动相关的对象"

时间:2016-10-03 07:49:09

标签: android android-fragments timer code-documentation

我对编程比较陌生,我在改变方向时遇到了麻烦。我会感激任何想法 这是关于官方android文档的具体问题,请不要将此问题报告为重复,并向我显示通用处理运行时线程。

阅读完文档后,我不确定下面引用的部分。

我的问题:如果我有一个显示TextView中当前值的计时器,这是否意味着我不应该使用fragmant来保留该对象?
或者它只是意味着我应该完全从活动中分离出碎片?

Android文档:

  

警告:虽然您可以存储任何对象,但是您永远不应该传递与Activity绑定的对象,例如Drawable,Adapter,View或与Context关联的任何其他对象。如果这样做,它将泄漏原始活动实例的所有视图和资源。 (资源泄漏意味着您的应用程序会保留它们并且不能进行垃圾回收,因此可能会丢失大量内存。)

https://developer.android.com/guide/topics/resources/runtime-changes.html#RetainingAnObject

背景资料:

我的应用程序:(几个)间隔计时器 如果在运行期间发生方向更改,我想保留计时器的显示。

我首先在表现中使用了一个hacky解决方案,但它会导致问题,因此想到为什么不尝试干净地解决问题。
如果我不能完成它,那么很可能我会让用户决定她或他更喜欢哪个方向,然后在计时器的运行期间修复它。

1 个答案:

答案 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);
    }

}

如果您需要处理方向更改,我相信该链接讨论了如何使用onSaveInstanceStateonRestoreInstanceState方法