- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想知道创建一个在某些 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 可能会被阻塞,等待服务完成将数据写入单例。
正如另一个人所说,您还必须记住,如果操作系统需要资源,您的单例可能会被释放,并且您的数据可能不再存在。
编辑:
使用单例作为后台( 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/
我对 Android 很陌生,如果问题重复,请避免并发送链接。有三个 Activity A、B 和 C。 Activity A 获取一个用户名,我想在 Activity C 中显示该用户名,但我想先运
我正在尝试制作记事本应用程序,因此每次打开新笔记时,布局都会相同。另外, Activity 的数量(新注释)不应定义得尽可能多 最佳答案 如果 Activity 始终相同,您可能应该创建一个适配器,允
我有 3 个 Activity 。 主窗口 5 个按钮 在按钮的主窗口中按下此窗口打开(将其称为父窗口) 在父窗口按钮上按下此窗口打开调用它作为结束子窗口。 现在从子窗口我从父窗口获取值如下:
我遇到了一个 Activity backstack 问题。假设我的后台有 5 个 Activity :比如 Activity A、 Activity B、 Activity C、 Activity D
我正在寻找必须具有以下附加特征的 JMS 提供程序: 采用多代理,所有代理都必须处于事件状态(无单点故障) 仅在两台机器上进行扩展就足以满足我们的需求 能够保证订购(如果 1 个生产者 + 1 个消费
假设,我有一个由 TabHost 组成的选项卡 Activity 。 TabHost 包含 2 个选项卡,每两个选项卡都有一个 Activity 组。每个 Activity 组包含一项 Activit
我正在开发一个应用程序,我需要根据某些操作导航到特定 Activity 。这是一张图片 我的第一个 Activity 是 ReadingActivity。基于某些操作,用户将被带到 NewProjec
我创建了一个与服务器异步通信的应用程序。当应用程序发出服务器请求时,将创建一个带有“正在加载”通知的新对话框( Activity )。主要 Activity 实现了处理服务器响应的方法,我想在主要 A
我想在我的所有应用程序 Activity 中显示相同的选项菜单。我创建了一个实现菜单的通用 Activity ,并且我所有的进一步 Activity 都扩展了它。 问题:当我需要扩展其他特定 Acti
我有四个 Activity ,即 java 文件 - Activity1.java、activity2.java、activity3.java、activity4.java 和 xml 文件 - Ac
我有两个 Activity 。我想将数据从第二个 Activity 发送到上一个 Activity 。第一个 Activity 有自定义 ListView 和 bean 类。当我点击第二个 Activ
根 Activity 是堆栈中当前的第一个 Activity 还是 list 中指定为启动 Activity 的 Activity ? 支持应用程序 P 在启动时启动 Activity A。然后 A
你好 我想知道您在绘制 Activity 图选择“Activity ”时考虑了哪些关键点? 您如何从要建模的问题中选择 Activity ? 谢谢 最佳答案 Activity 图用于对正在开发的系统和
如何从主 Activity 启动 Activity 并在子 Activity 返回主 Activity 中退出操作后返回主 Activity ? 我已将子 Activity 作为启动器 Intent
我的工作流程如下: 登录 Activity -> ActivityB -> ActivityC -> ActivityD 我想将数据从LoginActivity传递到ActivityD,但不直接传递到
我之前曾尝试获得此问题的答案,但找不到可以解决我的问题的答案。我正在制作保存圆盘高尔夫球分数的应用程序。我的 MainActivity 有 4 个按钮。新比赛、恢复比赛、类(class)和球员。 At
我有一个 tts 非 UI 类和 Activity 类。现在在 Activity 类中,我有一个按钮,用户可以从中选择男声或女声,具体取决于我想要将字符串传递给 tts 类的选择,然后一次tts 类根
问题有点复杂,首先, Activity A 和 Activity B 的 list 中都有 android:noHistory = true 。我有一个自定义 serialized 类,假设 MyCl
在我的应用程序中,我有两个 Activity (AuthenticationActivity 和 MainActivity),每个 Activity 都有一个导航图和大量 fragment 。我创建了
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: How can i use compose email activity in tabView? 我想在选项
我是一名优秀的程序员,十分优秀!