gpt4 book ai didi

Android:在Activity和Service之间使用的Singleton

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:06:08 24 4
gpt4 key购买 nike

我想知道创建一个在某些 Android Activity 和 Android 服务之间使用的单例是否是个坏主意。据我所知,静态字段,在我的例子中是 Singleton,只要整个进程还活着就可用。

我的计划是使用单例而不是 Parcelable 在我的 Activity 和后台服务之间共享数据。所以我的 Activity1 将通过调用 MySingleton.getInstance().addData(foo); 添加一些数据;然后我会发送一个 Intent 来通知我的服务新数据已添加到单例中。接下来我的 BackgroundService 将处理 Intent 并调用 MySingleton.getInstance().getLatestData();然后它会处理数据(需要一些时间)。服务的结果接下来将通过使用单例“发布”回来并触发广播 Intent ,由 Activity1(如果存在)处理,Activity1 将从单例中检索结果。

你们认为这是个坏主意吗?

编辑:我想要实现的是一个和平的软件,它从 Web 服务器下载数据并解析它并返回结果。所以我的 Activity 会创建 DownloadJob 对象。 DownloadJob-Object 将被放入 DownloadScheduler (Singleton),它对所有 DownloadJob 进行排队和管理。 DownloadScheduler 将允许同时运行 5 个 DownloadJobs 并使用队列来存储等待。有效的下载将由 DownloadService (IntentService) 完成,它通过 Intent 获知现在应该立即执行(下载)新的 DownloadJob。 DowanlodService 将从 DownloadScheduler 队列 (PriorityBlockingQueue) 中检索下一个作业,并通过设置 DownloadJob.setResult(...) 返回结果并启动广播 Intent ,表明结果已准备就绪,这将由 DownloadScheduler 接收从队列中移除作业并通知 Activity 下载完成等。

因此,在我的场景中,我将使用单例从 DownloadService 访问 DownloadJobs,而不是制作 DownloadJob Parcelable 并通过 Intent 传递它。所以我会避免这个问题,我在内存中有两个 DownloadJobs(一个在“Activity 站点”上,一个在“服务站点”上)。

有什么建议可以更好地解决这个问题吗?

像 DownloadScheduler(Singleton) 这样的静态实例是否会在内存不足时被 android 系统释放使用?那么将应用程序子类化并将引用(非静态)保存在那里可以避免这个问题吗?

最佳答案

如果您使用单例只是作为后台服务之间的共享内存,我假设在不同线程上执行操作,您可能会遇到同步问题和/或读取不一致的数据。

如果单例中的数据不同步,你必须要小心,因为你依赖于你的“协议(protocol)”来确保当你的后台线程正在写入时没有人在读取(这可能会导致错误)。

另一方面,如果它是同步的,您将面临错误的风险,因为读取数据的 Activity 可能会被阻塞,等待服务完成将数据写入单例。

正如另一个人所说,您还必须记住,如果操作系统需要资源,您的单例可能会被释放,并且您的数据可能不再存在。

我宁愿使用事件总线,例如 ottoeventbus

编辑:

使用单例作为后台( Intent )服务的入口点是 2010 年 Virgil Dobjanschi talk 中建议的方法。关于为 Android 构建休息客户端应用程序。

建议的方法是使用一个单例作为正在进行的请求的 Controller 。还请考虑对 Intent 服务的请求已由操作系统排队,因此您可以抛出多个 Intent ,这些 Intent 将由 Intent 服务按顺序处理。

前段时间我也尝试以此为起点做一个库,目前还未完成。您可以找到来源 here

我肯定不会做的是将你的数据存储在单例中。我更喜欢的方法是将数据存储在一些持久存储中(例如 sql/preferences/file/content provider)并通过广播消息让客户端知道更改(或者,如果您使用的是内容提供程序,通过观察员)。

最后,在某种程度上,这是 robospice 遵循的方法库,它看起来相当成熟并提供了许多有趣的功能,例如缓存。

关于Android:在Activity和Service之间使用的Singleton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13519140/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com