Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.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/201.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 小部件、服务和应用程序模型(单例)之间的通信(类似MVC的体系结构)_Java_Android_Design Patterns_Service_Widget - Fatal编程技术网

Java 小部件、服务和应用程序模型(单例)之间的通信(类似MVC的体系结构)

Java 小部件、服务和应用程序模型(单例)之间的通信(类似MVC的体系结构),java,android,design-patterns,service,widget,Java,Android,Design Patterns,Service,Widget,我遇到了一个复杂的问题,涉及应用程序的许多不同组件。我希望说得够清楚 在我的应用程序中,应用程序对象(singleton)为许多活动提供了一个模型(singleton)。主要活动向用户显示计时数据的列表。这些数据来自模型 我还有一个小部件,我希望它: -从模型内更新定时数据时更新(通过GUI) -随着时间的推移,更新为仅显示列表中的2个首次计时数据,删除现在已过时的数据 为了实现第二个目标,我设计了一个服务,要求模型获取一些数据,并使用计时器在第一个数据过期后唤醒,将其从列表中删除,然后向小部件

我遇到了一个复杂的问题,涉及应用程序的许多不同组件。我希望说得够清楚

在我的应用程序中,应用程序对象(singleton)为许多活动提供了一个模型(singleton)。主要活动向用户显示计时数据的列表。这些数据来自模型

我还有一个小部件,我希望它: -从模型内更新定时数据时更新(通过GUI) -随着时间的推移,更新为仅显示列表中的2个首次计时数据,删除现在已过时的数据

为了实现第二个目标,我设计了一个服务,要求模型获取一些数据,并使用计时器在第一个数据过期后唤醒,将其从列表中删除,然后向小部件发送一个广播,其中包含一些小部件将显示的数据

这个很好用

但我也希望小部件在模型中的数据发生变化时立即更新(不是因为时间流逝,而是因为用户通过GUI请求一些其他数据)

但是,我的问题是:

模型如何告诉小部件进行更新?服务更新小部件的一切都准备就绪,但引擎无法知道是否有小部件。我不希望模型调用服务,因为可能没有小部件,也不需要为服务添加额外的进程

如何对这种互动进行优雅的重新设计

我在这里真的遗漏了一些东西。

您可以使用将引擎点火事件发送到应用程序中感兴趣的任何组件,无论何时更新内容,而事件生成组件都不需要真正了解事件使用者


作为参数发送的事件对象应包含有关事件的所有相关信息,以便UI小部件更新自身等,以便只需传递此抽象“事件”对象,并且您的层不会相互渗透。

我习惯于观察者模式,并在位置或定时数据更改时使用它刷新GUI。但是在这里,您的意思是服务可以是一个侦听器,并在创建时将自己注册到模型中吗?对我来说,这似乎很奇怪,服务不是在自己的流程中运行吗(因此它将有自己的模型,而不是actvities共享的模型?)对不起,不太熟悉Android应用程序架构-没有意识到这些东西是在不同的流程中运行的processes@Snicolas在文档
中,请注意服务与其他应用程序对象一样,在宿主进程的主线程中运行默认情况下,它们不仅在同一进程中,而且也是同一线程。显然,这是可以修改的,
IntentService
实际上会生成一个单独的线程来处理。多亏了@smith324和@matt b。它就像一个魔咒,真的很震撼,随着时间的推移,我的小部件被调用自己的服务更新,并通过可观察的观察者刷新,聆听GUI->controler->model更改。我不能分享这些观点,但你们都有。