2016-10-03 12 views
0

我对编程相对比较陌生,我遇到了方向更改的麻烦。我会很感激任何想法。
这是关于官方android文档的一个具体问题,请不要将此问题报告为重复,并向我展示通用处理运行时线程。了解android文档:处理运行时片段“绝不应该传递与活动关联的对象”

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

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

Android文档:

注意:虽然您可以存储任何对象,你永远不应该传递是联系在一起的活动对象,如可绘制,适配器,视图或任何其他对象的与上下文相关联。如果这样做,它会泄漏原始活动实例的所有视图和资源。 (泄漏资源意味着你的应用程序维护他们保持,他们可以被垃圾收集,所以大量的内存可能会丢失。)

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

背景资料:

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

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

回答

0

显然,您不应该参考Timer中的TextView。你可以阅读内存泄漏,如果你想要的话,但是这个报价给出了一个很好的理由......“你的应用程序保持对它们的保留并且它们不能被垃圾收集,所以很多内存可能会丢失”

不过,您可以使用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方法

+0

这有用 - 谢谢!我将它们添加为最终的TextView作为参数(似乎不是很好,但无法想到其他任何东西)。我会改变我的代码,按照你的建议使用一个界面 - 非常感谢! –

+0

我很抱歉成为一个白痴,但你能给我更多关于“公共无效日程安排(...){// TODO:选择哪一个要覆盖的细节”。我在这里输了:( –

+0

你说你使用的是Timer类,我查阅了Android SDK中看到的唯一的Timer类,有多种具有不同参数的调度方法 –