Android:使用带有Views的观察者模式(可能是MVC,MVVM相关)

时间:2011-07-12 19:39:51

标签: java android model-view-controller observer-pattern

我花了几个小时阅读有关在Android中实现各种MVC类型模式的各种问题和答案。我在各种博客中看到了一些代码示例。但是,我仍然会欣赏一些关于我想要实现的想法和意见。具体来说,我想找出最好的代码机制来通知单个View或一组Views,特定的数据项已被更改。

我的应用程序非常简单,它通过蓝牙从硬件设备获取测量数据,并显示和记录该数据。目前,我有一个服务,负责蓝牙通信和后台日志记录。我有一个'全局'数据存储类,它是Application的扩展。

当从外部设备轮询测量数据时,测量数据(实际上大约30个字节的数据)在数据存储对象中更新(在MVC术语中,我猜测是'模型' )。

任何时候,UI视图都只会显示该数据的一小部分。通常,给定的视图仅对表示测量数据的一个特定字节感兴趣。当用户移动到不同的Activity类时,将显示其他视图,这些视图将显示该数据的不同子集。

因此,为了达到目的,我正在尝试选择在更改给定数据项时在感兴趣的视图上调用invalidate()的最佳方法。

选项似乎是:

  1. 利用现有的Observer类和相关的类。

  2. 通过在数据模型中创建自己的register()和unregister()函数,实现'滚动我自己'的观察者模式。观察者视图将保存在ArrayList中(或者可能是每个数据项的一个观察者列表的更复杂的排列)。每次更新数据时我都会循环遍历此ArrayList并调用invalidate()(或postInvalidate()当然,具体取决于我的线程排列)。

  3. 为什么我应该使用上述其中一种而不是另一种?我还应该考虑其他“观察员”机制吗?

2 个答案:

答案 0 :(得分:3)

Android中的许多视图都由BaseAdapter的某个子类支持,它有一个方法notifyDataSetChanged(),指示视图刷新自身。如果您正在使用视图(例如ListViewGridView或任何AdapterView的后代),那么它将由BaseAdapter支持,您只需更新该适配器并且视图将自行刷新。

我想这意味着,我投票说你使用了内置的观察者模式。如果您使用的是自定义视图,那么显然这将无效,您无论如何都必须使用自定义方法进行刷新。

答案 1 :(得分:0)

另一个选择是使用Android Intent框架。当在服务中接收到新数据时,将数据设置为通用模型,并使用Context.broadcastIntent(Intent)方法广播该数据已被更新的意图。任何对该数据感兴趣的视图都将使用Context.RegisterReceiver(Receiver)和Context.unregisterReceiver(Receiver)方法注册和注销接收者。从那里,视图将从通用模型中检索数据并相应地更新视图。

我认为这可能就是Android.Lifecycle.Observer包中的观察者模式在幕后所做的事情。