【发布时间】:2012-11-24 06:36:03
【问题描述】:
我想知道创建一个在某些 Android 活动和 Android 服务之间使用的单例是否是个坏主意。据我所知,只要整个流程还活着,就可以使用静态字段,在我的情况下是单例。
我的计划是使用单例而不是 Parcelable 在我的活动和后台服务之间共享数据。所以我的 Activity1 将通过调用 MySingleton.getInstance().addData(foo); 添加一些数据;然后我会发送一个 Intent 通知我的服务新数据已添加到单例中。接下来,我的 BackgroundService 将处理意图并调用 MySingleton.getInstance().getLatestData();然后它将处理数据(需要一些时间)。服务的结果接下来将通过使用单例“回传”并触发广播意图,由 Activity1(如果还活着)处理,而 Activity1 将从单例中检索结果。
你们觉得这是个坏主意吗?
编辑: 我想要实现的是一个从网络服务器下载数据并解析它并返回结果的软件。所以我的 Activity 会创建 DownloadJob 对象。 DownloadJob-Object 将被放入排队和管理所有 DownloadJobs 的 DownloadScheduler (Singleton)。 DownloadScheduler 将允许同时运行 5 个 DownloadJobs 并使用队列来存储等待。有效的下载将由 DownloadService (IntentService) 完成,它通过 Intent 获得通知,现在应该立即执行(下载)新的 DownloadJob。 DowanlodService 将从 DownloadSchedulers 队列 (PriorityBlockingQueue) 中检索下一个作业,并通过设置 DownloadJob.setResult(...) 返回 Result 并启动广播意图,即 Result 已准备好,这将由 DownloadScheduler 接收从队列中删除作业并通知 Activity 下载完成等。
因此,在我的场景中,我将使用单例从 DownloadService 访问 DownloadJobs,而不是使 DownloadJob Parcelable 并与 Intent 一起传递。所以我会避免这个问题,我在内存中有两个 DownloadJobs(一个在“活动站点”上,一个在“服务站点”上)。
有什么建议可以更好地解决这个问题吗?
静态实例,如 DownloadScheduler(Singleton),是否会被 android 系统在低内存上释放?那么子类化应用程序并保留引用(非静态)会避免这个问题吗?
【问题讨论】:
-
是的,这是个坏主意,在 Android 中,您的进程可能随时终止,将您的数据保存在某个持久存储中,然后编写一个内容提供程序作为其接口。
-
我不通过网络来持久存储数据。我只需要某种队列,Activitis 将一些对象放入其中,服务检索它们并做一些工作,然后返回结果......