我在一个活动中有一堆代码,显示一些外部数据的运行图。由于活动代码变得混乱,我决定提取此代码并创建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
派生类中很简单。但是有一些生命周期管理代码与创建和销毁此图所使用的计时器和事件监听器相关联(例如,如果活动暂停,我不希望在后台轮询这个事物。)
来自MS Windows背景,我希望找到可覆盖的onCreate()
和onDestroy()
方法或类似的东西,但我在LinearLayout(或其任何一个)中找不到任何类型的东西继承成员)。必须将所有这些初始化代码留在Activity中,然后必须将其传递到视图中,这似乎打败了将所有这些代码封装到可重用视图中的最初目的。
我最终在我的视图中添加了两个额外的公开方法:start()
和stop()
。我分别从活动的onResume()
和onPause()
方法拨打这些电话。
这似乎有效,但感觉我在这里使用胶带。有谁知道这通常是怎么做的?我觉得我错过了什么......
答案 0 :(得分:23)
你可能可以从覆盖protected void onAttachedToWindow()
和protected void onDetachedFromWindow()
中取消一些我从未尝试过的用法,但是当你想要的时候可以大致调用它们。
答案 1 :(得分:6)
我只是做了一个简短的实验,但是如果你覆盖上面CaseyB提到的onAttachedToWindow
和onDetachedFromWindow
以及重写
protected void onWindowVisibilityChanged(int visibility)
它应该为您提供所需的信息。
我遇到了和你一样的情况。我很惊讶没有通知机制。
答案 2 :(得分:2)
不幸的是,从后台和活动模式进入时,View对象没有任何回调方法作为活动。
无论如何,如果你坚持这样的方法,我想你得到的最接近的是将init代码放入构造函数中,并将destruct代码放入finalize()的覆盖中。但是,当对象不再被引用时,系统会运行finalize()方法,使其准备好进行垃圾回收。如果vm退出,可能根本不会调用它。我不会这样推荐。
此外,当您的应用程序从暂停状态变为恢复状态时,您不希望一遍又一遍地创建和销毁GraphView对象,因为短暂的对象会导致内存泄漏。您永远不知道何时gc将释放这些对象的内存,即使没有对它们的引用。
我认为你对start()和stop()方法的认可是可以的,只需保持简单和干净。他们所要做的就是维护AsyncTasks(或Timer对象)。
(关于你夸大你的观点的方式的偏离主题:我主要使用View.inflate(),因为它为我节省了几行代码)