【问题标题】:Best method to run a periodic background service in java blackberry在 java blackberry 中运行定期后台服务的最佳方法
【发布时间】:2013-08-13 10:16:54
【问题描述】:

目标:我想开发一个运行服务/任务/方法的UI应用程序 定期更新数据库。该服务应该在之后启动 即使我的应用程序不活动/可见/用户退出,也会定期 应用程序。类似于an Android Service

我正在使用 BlackBerry Java 7.1 SDK eclipse 插件。

我遇到的选项如下:

1)How to run BlackBerry application in Background

此链接建议我扩展 Application 而不是 UIApplication。但我不能这样做,因为我的应用程序有一个用户界面

2)Make application go in background

我不希望我的 UI 应用程序进入后台,而是希望我的应用程序定期调用该服务。

3)Run background task from MainScreen in BlackBerry?

此链接建议我运行一个线程,但我不认为如果用户退出我的应用程序,那么该线程将在后台运行

4)Blackberry Install background service from UI application?

这建议使用CodeModuleManager,我不知道它的用法。

请建议实现这一目标的最佳方法或建议任何其他更好的方法。

我是黑莓新手,所以请原谅我的无知。

【问题讨论】:

    标签: service blackberry blackberry-eclipse-plugin blackberry-jde


    【解决方案1】:

    扩展彼得的答案:

    1. 你需要创建两个类:

      class BgApp extends Applicaton
      class UiApp extends UiApplication
      

      我猜你已经创建了扩展 UiApplicaiton 的类。所以添加另一个扩展应用程序的类。

    2. 然后创建一个扩展TimerTask的类并实现其run方法来调用更新数据库的方法。

      class UpdateDatabaseTask extends TimerTask
      
    3. 在 BgApp 构造函数中,创建一个 Timer。并使用schedule(TimerTask, long, long) 方法安排UpdateDatabaseTask

    4. 定义备用入口点,选中 bgapp 入口点的“不显示在主屏幕上”和“启动时自动运行”复选框。

    5. 使用内置的持久化机制(PersistentStorePersistable 接口)来存储数据是最简单最简单的。即使您使用任何其他方式,如 RecordStore 或 SQLDb,UiApp 和 BgApp 都可以使用访问同一个数据库。 bgapp 更新的值将被 uiapp 访问,反之亦然,自动访问。

    6. 如果您想从 bgapp 向 uiapp 发送信号(例如,当 bgapp 下载新数据时,您希望 uiapp 立即重新加载数据),请在下载完成时发布全局事件 (ApplicationManager.postGlobalEvent())并在显示数据的屏幕中监听(GlobalEventListener 界面)。

    作为 SDK 的一部分,每个都有代码示例,或者在 Internet 上搜索,您会发现很多实现。

    【讨论】:

    • 感谢您的回复-您能否提供一些有关 UIApplication 和非 UI 应用程序如何使用相同数据库的链接或信息??
    • @RachitaNanda 它是自动发生的。你不需要做任何特别的事情。 BlackBerry 运行时不会区分 Ui 和非 Ui 应用程序,因此可以从两个应用程序访问相同的数据库。结帐docs.blackberry.com/en/developers/deliverables/29299/… 了解有关如何创建和使用持久性的信息。
    • @adwiv 谢谢,但我有一个大型关系数据库,所以我将使用 sqlite。sqllite 也可以共享数据库吗??
    • 是的,sqlite 数据库只是存储为文件。因此可以从任何地方(甚至从其他应用程序)轻松访问它们
    【解决方案2】:

    很好的研究,很多有趣的想法。

    我认为最好的办法是尝试简单的标准方法,并且只在需要时制作更复杂的东西。

    这里有两个被视为“标准”的选项,它们具有简要的优点和缺点:

    a) 让你的 UiApplication 进入后台

    当用户按下“关闭”按钮时,您的 UiApplication 不会退出,而是“requestBackground()”。当用户单击图标或从任务切换器中选择您的应用程序时,它将自动被购买到前台。然后,您可以随时运行一个线程,或者实际上让一个线程运行以更新数据库。

    这是我的首选方法。但是您必须小心内存管理以确保没有泄漏。有些人不喜欢应用程序始终在任务切换器上可见的想法。

    b) 备用条目

    使用此选项,您的一个应用程序包包含两个应用程序,或者更准确地说,一个应用程序和一个 UiApplication。 UiApplication 在用户单击图标时运行。应用程序作为后台任务运行,并为您的 UiApplication 更新数据库。

    这看起来是一个更优雅的解决方案,但会引入一些可能的通信问题,并且更难以调试。

    在你的情况下,由于你对BB比较陌生,我建议你使用选项a,如果你发现它不适合你,你会发现切换到选项b并不难。

    并评论您已经提出的选项:

    1. 选项 b 覆盖的排序
    2. 选项一
    3. 你是对的 - 如果应用程序退出,所有线程都会被杀死
    4. 留下了首先创建应用程序然后调试它的问题。这对您来说并不是真正的解决方案,而是一种实现方法。

    以上是简要的,不清楚的请追问。 这可能对 b 有所帮助: http://supportforums.blackberry.com/t5/Java-Development/Set-up-an-alternate-entry-point-for-an-application/ta-p/444847

    编辑:

    编辑此以回答问题并扩展替代答案,该替代答案扩展了这个(我知道有点循环......)。

    要先回答第二个问题,我同意另一个答案,即备用条目(后台)和前台应用程序可以共享 SQLite 数据库。

    关于这两个如何通信,虽然它们工作得很好,但我个人不是全局事件的忠实粉丝,因为它们会传播到 BlackBerry 上的所有应用程序。您可以通过许多替代方式来实现类似的事情 - 诀窍是找到两个应用程序共有的东西,以便它们可以通信。为此,我推荐使用 RuntimeStore。请参阅此知识库文章:

    http://supportforums.blackberry.com/t5/Java-Development/Create-a-singleton-using-the-RuntimeStore/ta-p/442854

    关于如何持久化数据库,我喜欢 PersistentStore,因为它存在于所有设备上。但是如果你真的有一个数据库,而不是持久对象,那么 SQLite 似乎是理想的选择。我个人不会使用 RecordStore,但这里是对选项的讨论:

    http://supportforums.blackberry.com/t5/Java-Development/Introduction-to-Persistence-Models-on-BlackBerry/ta-p/446810

    澄清一下 - 在给出的示例中,您有两个应用程序,BgApp 和 UiApp。您将只有一个 main() 方法。这个主要方法将使用您指定的参数来确定要启动哪个参数,它将创建哪个参数并让它“进入调度程序”。如果我可以提出建议 - 使用“gui”作为参数来指定您将启动 UiApplication。我遇到过这样的情况,即操作系统尝试使用此字符串启动我的备用条目 Ui 应用程序,而不管我实际指定了什么。可能是一次性的,但从那以后我一直坚持这样做。

    最后两个cmets就使用Timers和Timertask来提供触发事件。首先要评论的是您在 TimerTask 中运行的任何内容都不应该花那么长时间 - 所以您应该只使用 TimerTask 来启动下载线程(这可能需要很长时间)。其次对我来说,在这种情况下,我不会使用 Timer/TimerTask。我宁愿只有一个线程,它“等待”,然后处理。对我来说的好处是这可以是自适应的。例如,如果您无法连接,那么您可能会缩短到下一次连接尝试的时间。或者如果是下班后,那么您可能会延长连接之间的时间以减少电池使用量。或者,当电池电量非常低时,您可能会完全停止连接。

    希望这会有所帮助。

    【讨论】:

    • 我想使用选项 b 但是应用程序和 ui 应用程序之间的通信如何可能?他们可以共享一个共同的数据库吗??
    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 2022-12-06
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多