Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android:在视图中使用观察者模式(可能是MVC,与MVVM相关)_Java_Android_Model View Controller_Observer Pattern - Fatal编程技术网

Java Android:在视图中使用观察者模式(可能是MVC,与MVVM相关)

Java Android:在视图中使用观察者模式(可能是MVC,与MVVM相关),java,android,model-view-controller,observer-pattern,Java,Android,Model View Controller,Observer Pattern,我花了几个小时阅读了关于在Android中实现各种MVC类型模式的各种问题和答案。我在各种博客上看到了一些代码示例。不过,对于我正在努力实现的目标,我仍然希望有一些想法和意见。具体来说,我想找出最好的代码机制来通知单个视图或一组视图某个特定的数据项已经更改 我的应用程序非常简单,它通过蓝牙从硬件设备获取测量数据,并显示和记录这些数据。目前,我有一个服务,负责蓝牙通信和后台记录。我有一个“全局”数据存储类,它是应用程序的扩展 当测量数据从外部设备轮询时,测量数据(实际上大约是30字节的数据)在数据

我花了几个小时阅读了关于在Android中实现各种MVC类型模式的各种问题和答案。我在各种博客上看到了一些代码示例。不过,对于我正在努力实现的目标,我仍然希望有一些想法和意见。具体来说,我想找出最好的代码机制来通知单个视图或一组视图某个特定的数据项已经更改

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

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

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

因此,为了切中要害,我正在尝试选择一种最佳方法,以便在更改给定数据项时,在感兴趣的视图上调用
invalidate()

选择似乎是:

  • 利用现有的Observer类和相关类

  • 通过在数据模型中创建我自己的register()和unregister()函数,类似于“滚动我自己的”观察者模式。观察者视图将保存在ArrayList中(或者可能是每个数据项一个观察者列表的更复杂排列)。每次数据更新时,我都会循环遍历这个数组列表,并调用
    invalidate()
    (当然也可以调用
    postInvalidate()
    ,这取决于我的线程安排)


  • 有什么理由我应该使用上面的一个而不是另一个?还有其他的“观察者”机制我应该考虑吗?

    < P> Android中的许多视图被一些子类支持,其中的一个子类有一个方法来指导视图刷新自己。如果您使用的是一个视图(如或或的任何子视图),那么它由BaseAdapter支持,您只需更新该适配器,视图就会自动刷新


    我想这意味着,我赞成使用内置的观察者模式。如果您使用的是自定义视图,那么显然这不起作用,您必须使用自定义的刷新方法。

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


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

    谢谢您的回答;非常感谢。事实上,我应该提到的一点是,我的视图是在RelativeLayout中构造的(据我所知,RelativeLayout没有标准适配器,但我会检查)。实际上这很有趣,因为不久前我问了这个问题:我想知道我是否应该遵循标准适配器接口。这似乎是这样做有利的另一个原因。在这种情况下,您唯一的选择是在RelativeLayout上调用invalidate()。因此,您需要像您所说的那样实现观察器。内置java.util.observate&java.util.observate是一种简单的方法。我认为这取决于你的设计(数据存储的位置);子视图是自己获取的还是存储的?如果他们抓住了它,我只需将RelativeLayout注册到数据结构中,并让它在进行更改时“通知”布局。