2013-02-19 48 views
1

我有科尔多瓦应用程序与插件本地通知。问题在于,cancelAll()不会等到它完成,因此在我添加新消息时它仍在删除。Android本地通知科尔多瓦:等待取消所有完成

如何同步线程以使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; 
} 

回答

0

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

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

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

为什么你在第一个地方打电话cancelAll()?更新你的通知。

此外,请不要有多个通知,因为这被认为是不好的形式。通过一个通知所有未处理的“消息”,当用户对这些“消息”采取行动时(例如,访问收件箱),该消息被清除。

+0

向用户显示的只有一条或两条消息,其他人预定在将来出现。有时候这些未来的日期会发生变化,需要删除。从JavaScript我没有访问真正的列表,因此我更容易删除和重新创建它们。无论如何,我不相信这是不可能的。在xcode中很容易解决[类似问题](http://stackoverflow.com/questions/14731111/only-first-object-of-nsmutablearray-is-stored-in-nsuserdefaults)。 – PiTheNumber 2013-02-19 15:55:41

+0

@PiTheNumber:“无论如何,我不相信这是不可能的” - 你也欢迎相信这个世界是平坦的。通知是在操作系统进程中处理的,与您的请求异步显示或删除它们,并且您可以做的任何事情都不会改变创建您自己的Android版本的情况。 – CommonsWare 2013-02-19 16:00:04

+0

您可以同步资源访问的多线程语言并没有什么意义。是的,资源由OS处理,但我可以同步我的图层。像[ReentrantLock](http://stackoverflow.com/questions/3392139/thread-synchronization-java)或[Synchronized Methods](http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth)。 HTML)可能会工作... – PiTheNumber 2013-02-19 16:30:42