Android:Activity和Service之间使用的单例
即时通讯想知道是否创建一个Android的活动和Android服务之间使用的单身人士是一个坏主意。 据我所知静态字段,在我的情况下,Singleton,只要整个进程是活着的就可用。
我的计划是使用单例而不是Parcelable在我的活动和后台服务之间共享数据。 所以我的Activity1会通过调用MySingleton.getInstance()。addData(foo)来添加一些数据; 那么我会发送一个意图通知我的服务,新的数据已被添加到单身人士。 接下来,我的BackgroundService将处理意图并调用MySingleton.getInstance()。getLatestData(); 那么它会处理数据(需要一些时间)。 该服务的结果将通过使用单例并发出广播意图,然后通过Activity1(如果存在)处理,并且Activity1将从单例中检索结果,从而“返回”后面的结果。
你们认为这是一个坏主意吗?
编辑:我想要实现的是从Web服务器下载数据并将结果返回的软件的和平。 所以我的活动将创建DownloadJob对象。 DownloadJob对象将被放入DownloadScheduler(Singleton)中,该队列和管理所有DownloadJobs。 DownloadScheduler将允许同时运行5个DownloadJobs并使用队列来存储等待。 有效的下载将由DownloadService(IntentService)完成,该服务通过Intent得知现在应该执行(下载)一个新的DownloadJob。 DowanlodService将从DownloadSchedulers队列(PriorityBlockingQueue)中检索下一个作业,并通过设置DownloadJob.setResult(...)返回结果并启动广播意图,结果已准备就绪,将由DownloadScheduler接收从队列中删除作业并通知活动下载完成等。
所以在我的场景中,我将使用单例从DownloadService访问DownloadJobs,而不是制作DownloadJob Parcelable并将其与Intent一起传递。 所以我会避免这个问题,我在内存中有两个DownloadJob(一个在“活动网站”,一个在“服务网站”)。
任何建议如何解决这个更好?
是不是真的,像DownloadScheduler(Singleton)这样的静态实例会被android系统在低内存中释放使用? 那么将子类化应用程序并在那里保存参考(非静态)可以避免这个问题?
如果您使用单例作为后台服务(我假设在不同的线程上执行操作)之间的共享内存,则可能会遇到同步问题或读取不一致的数据。
如果单例中的数据不同步,则必须小心,因为您依赖于“协议”来确保在后台线程写入时没有人正在读取数据(这可能会导致错误)。
另一方面,如果它是同步的,那么您冒着面临错误的风险,因为读取数据的活动可能会被阻塞,等待服务完成将数据写入单例中。
正如其他人所说的,你还必须记住,如果你的单例需要资源,并且你的数据可能不再存在,你的单例可能会被释放。
我宁愿使用事件总线,如otto或eventbus
编辑:
使用单身作为背景(意图)服务的入口点是2010年建议的方法Virgil Dobjanschi谈论为Android构建休息客户端应用程序。
建议的方法是让一个单身人士执行持续请求的控制器。 请考虑到意向服务的请求已经被os排队,因此您可以抛出意图服务将按顺序处理的多个意图。
前一段时间,我还试图把它作为一个图书馆的起点,这个图书馆还没有完成。 你可以在这里找到来源
我当然不会做的是将数据存储在单例中。 我更喜欢的方法是将数据存储在某些持久性存储中(例如sql / preferences / file / content provider),并让客户通过广播消息知道更改(或者,如果您正在使用内容提供者,则通过观察员)。
最后,在一定程度上这是Robospice库所采用的方法,它看起来非常成熟并且提供了很多有趣的功能,例如缓存。
一个更好的想法是将应用程序进行子类化并在其中放置任何长生命的对象。 通过继承应用程序,您可以正确处理应用程序的启动和关闭,您无法轻松使用单例。 此外,通过使用应用程序Activites和服务可以在程序中共享对模型的访问权限,而不诉诸于可分区。 你可以避免单身人士给你的程序带来的所有问题。
您也不必诉诸于将所有内容都存储在数据库中,这需要大量的锅炉代码来推送一堆数据。 它没有做任何事情来分享应用程序各部分之间的行为,也没有做任何事情来促进活动的交流和集中。 如果你真的需要在停机状态之间坚持使用它,但是如果没有,你可以为自己节省很多工作。
你也可以考虑使用像Roboguice这样的技术,将共享模型注入到你的活动和服务中。
你可能会觉得这很有帮助:
Android开发中的设计模式原理是什么?
使用这样的单例并不一定是一个坏主意,但如果Android决定停止你的过程,你将失去它的状态。 您可能需要考虑将您的状态存储在SQLite数据库或持久队列中(以磁带为例)。
链接地址: http://www.djcxy.com/p/11499.html上一篇: Android: Singleton which is used between Activity and Service
下一篇: .Net assembly adds superfluous AND when setting bool to TRUE?