【问题标题】:Android Local Notification Cordova: Wait for cancelAll to finishAndroid 本地通知 Cordova:等待 cancelAll 完成
【发布时间】:2013-02-19 14:54:15
【问题描述】:

我有带有本地通知插件的 Cordova 应用程序。问题是cancelAll() 没有等到它完成,所以在我添加新消息时它仍在删除。

如何同步线程以使cancelAll() 等待?

一些相关代码AlarmHelper::cancelAll()

/**
 * @see LocalNotification#cancelAllNotifications()
 */
public boolean cancelAll(SharedPreferences alarmSettings) {
    final Map<String, ?> allAlarms = alarmSettings.getAll();
    final Set<String> alarmIds = allAlarms.keySet();

    for (String alarmId : alarmIds) {
        Log.d(LocalNotification.PLUGIN_NAME, "Canceling notification with id: " + alarmId);
        String alarmInt = alarmId;
        cancelAlarm(alarmInt);
    }

    return true;
}

【问题讨论】:

    标签: java javascript android cordova


    【解决方案1】:

    如何同步线程以使 cancelAll() 等待?

    你不能。 cancelAll() 是异步的。

    问题是 cancelAll() 不会等到它完成,所以在我添加新消息时它仍在删除。

    你为什么首先打电话给cancelAll()?就地更新您的通知。

    另外,请不要有多个通知,因为这被认为是糟糕的形式。为所有未完成的“消息”提供一个通知,当用户对这些“消息”采取行动(例如,访问了收件箱)时,该通知将被清除。

    【讨论】:

    • 只向用户显示一两条消息,其他消息计划在未来出现。有时这些未来的日期会发生变化,需要删除。从 JavaScript 我无法访问真实列表,因此我更容易删除并重新创建它们。无论如何,我不相信这是不可能的。在 xcode 中很容易解决 similar problem.
    • @PiTheNumber:“无论如何,我不认为这是不可能的”——也欢迎你相信世界是平的。通知在操作系统进程中处理,与您显示或删除它们的请求异步,除了创建您自己的 Android 版本之外,您无能为力。
    • 一种可以同步资源访问的多线程语言实际上没有意义。是的,资源由操作系统处理,但我可以同步我的图层。 ReentrantLockSynchronized Methods 之类的东西可能会起作用...
    • @PiTheNumber:“我可以同步我的图层”——不能以任何方式解决您的问题。您写道“在我添加新消息时它仍在删除”。 “删除”是由另一个进程完成的,您无法将任何内容与该进程的工作同步,除非您在自己的 ROM 模块上通过自己的 Android 版本重写该进程。
    • 不,我可以从日志中看出这是我的代码(上面发布的)正在运行。我只需要同步AlarmHelper::addAlarm()等到AlarmHelper::cancelAll()完成就可以了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多