Android 如何管理ViewGroup派生类中的生命周期?
我在一个活动中有一堆代码,显示一些外部数据的运行图。由于活动代码变得有些混乱,我决定提取此代码并创建一个Android 如何管理ViewGroup派生类中的生命周期?,android,Android,我在一个活动中有一堆代码,显示一些外部数据的运行图。由于活动代码变得有些混乱,我决定提取此代码并创建一个GraphView类: public class GraphView extends LinearLayout { public GraphView(Context context, AttributeSet attrs) { super(context, attrs); LayoutInflater inflater = (LayoutInflate
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(或其任何继承成员)中没有找到任何类似的方法。必须将所有这些初始化代码留在活动中,然后将其传递到视图中,这似乎违背了将所有这些代码封装到可重用视图中的最初目的
最后,我在视图中添加了两个额外的公共方法:start()
和stop()
。我分别从活动的onResume()
和onPause()方法进行这些调用
这似乎是可行的,但感觉就像我在用胶带一样。有人知道这通常是怎么做的吗?我觉得我遗漏了什么…不幸的是,View对象在从后台和活动模式转到活动时没有任何回调方法。
无论如何,如果您坚持使用这种方法,我想最接近的方法是将init代码放入构造函数中,将析构函数代码放入finalize()的重写中。尽管如此,当对象不再被引用时,系统会运行finalize()方法,使其做好垃圾收集的准备。如果vm退出,则可能根本不会调用它。我不推荐这种方式
此外,当你的应用程序从暂停到恢复时,你不想一次又一次地创建和销毁GraphView对象,因为短暂的对象会导致内存丢失。你永远不知道gc何时会为这些对象释放内存,即使没有对它们的引用
我认为您对start()和stop()方法的处理是可以的,只要保持它们的简单和干净即可。他们所要做的就是维护异步任务(或计时器对象)
(与膨胀视图的方式无关:我使用View.inflate()主要是因为它为我节省了几行代码)覆盖protected void onAttachedToWindow()
和protected void OnAttachedFromWindow()
我从未尝试过,但是它们可能会在您愿意的时候被调用。我只做了一个简短的实验,但是如果您覆盖了上面CaseyB提到的onAttachedToWindow
和OnAttachedFromWindow
,以及覆盖
windowvisibilitychanged上受保护的void(int可见性)
它应该给你你需要的信息
我遇到了和你一样的情况。我很惊讶这个问题没有通知机制。今天我问自己同样的问题!:)