如何pipe理ViewGroup派生类中的生命周期?

我在一个活动中有一堆代码,显示一些外部数据的运行图。 由于活动代码越来越混乱,我决定提取这段代码并创build一个GraphView类:

 public class GraphView extends LinearLayout { public GraphView(Context context, AttributeSet attrs) { super(context, attrs); LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(R.layout.graph_view, this, true); } public void start() { // Perform initialization (bindings, timers, etc) here } public void stop() { // Unbind, destroy timers, yadda yadda } . . . } 

将东西移动到这个新的LinearLayout派生类是很简单的。 但是有一些生命周期pipe理代码与创build和销毁此图所使用的计时器和事件监听器相关联(例如,如果活动已暂停,我不希望在后台轮询该事件)。

来自MS Windows背景,我期望find覆盖onCreate()onDestroy()方法或类似的东西,但我还没有发现LinearLayout(或其任何inheritance成员)的sorting。 不得不将所有这些初始化代码留在Activity中,然后不得不将它传递给视图,好像它击败了将所有代码封装到可重用视图的原始目的。

我结束了添加两个额外的公共方法,我的看法: start()stop() 。 我分别从活动的onResume()onPause()方法进行这些调用。

这似乎工作,但感觉就像我在这里使用胶带。 有谁知道这通常是怎么做的? 我觉得我错过了一些东西…

Solutions Collecting From Web of "如何pipe理ViewGroup派生类中的生命周期?"

你可能能够得到一些使用重写protected void onAttachedToWindow()protected void onDetachedFromWindow()我从来没有尝试,但他们可能会被称为近似,当你想。

我只做了一个简单的实验,但是,如果你重写onAttachedToWindow onDetachedFromWindow提到的onAttachedToWindow和onDetachedFromWindow以及重载

protected void onWindowVisibilityChanged(int visibility)

它应该给你你需要的信息。

我遇到了和你一样的情况。 我很惊讶没有这方面的通知机制。

不幸的是,当从后台和主动模式进入时,View对象没有任何callback方法作为Activity。

无论如何,如果你坚持这样的做法,我想最接近的是将init代码放入构造函数中,并将destruct代码放入finalize()的覆盖中。 但是,当对象不再被引用时,finalize()方法由系统运行,使得它可以被垃圾回收。 如果vm退出,它可能不会被调用。 我不会推荐这种方式。

此外,当您的应用程序从暂停状态恢复为短暂的对象导致内存泄漏时,您不希望一次又一次创build和销毁GraphView对象。 你永远不知道什么时候gc会为这些对象释放内存,即使没有引用它们。

我认为你的start()和stop()方法是可以的,只要保持简单和干净。 他们所要做的就是维护AsyncTasks(或Timer对象)。

(关于你膨胀你的视图的方式的主题:我主要使用View.inflate(),因为它节省了我几行代码)