Worklight 推送导致 ConcurrentModificationException

Posted

技术标签:

【中文标题】Worklight 推送导致 ConcurrentModificationException【英文标题】:Worklight push leads to ConcurrentModificationException 【发布时间】:2014-12-12 11:17:58 【问题描述】:

我们正在使用 worklight 6.2 来构建 android 本机客户端。最近我们遇到了一个异常会导致应用程序在收到推送通知时崩溃。我们按照官方教程构建了这个客户端。

场景

    应用程序被杀死 从 WL 服务器发送推送 在客户端。我们可以观察通知 点击通知启动应用程序后。它崩溃并显示以下错误日志。

日志如下。

12-12 10:43:41.995: E/AndroidRuntime(31144): java.lang.RuntimeException: Error receiving broadcast Intent  act=com.MeaWallet.MeaWallet.C2DM_REGISTERED flg=0x10 (has extras)  in com.worklight.wlclient.api.WLPush$3@2e2deef4
12-12 10:43:41.995: E/AndroidRuntime(31144):    at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:871)
12-12 10:43:41.995: E/AndroidRuntime(31144):    at android.os.Handler.handleCallback(Handler.java:739)
12-12 10:43:41.995: E/AndroidRuntime(31144):    at android.os.Handler.dispatchMessage(Handler.java:95)
12-12 10:43:41.995: E/AndroidRuntime(31144):    at android.os.Looper.loop(Looper.java:135)
12-12 10:43:41.995: E/AndroidRuntime(31144):    at android.app.ActivityThread.main(ActivityThread.java:5221)
12-12 10:43:41.995: E/AndroidRuntime(31144):    at java.lang.reflect.Method.invoke(Native Method)
12-12 10:43:41.995: E/AndroidRuntime(31144):    at java.lang.reflect.Method.invoke(Method.java:372)
12-12 10:43:41.995: E/AndroidRuntime(31144):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
12-12 10:43:41.995: E/AndroidRuntime(31144):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
12-12 10:43:41.995: E/AndroidRuntime(31144): Caused by: java.util.ConcurrentModificationException
12-12 10:43:41.995: E/AndroidRuntime(31144):    at java.util.ArrayList$ArrayListIterator.remove(ArrayList.java:586)
12-12 10:43:41.995: E/AndroidRuntime(31144):    at com.worklight.wlclient.api.WLPush.dispatchPendings(WLPush.java:712)
12-12 10:43:41.995: E/AndroidRuntime(31144):    at com.worklight.wlclient.api.WLPush.updateTokenCallback(WLPush.java:744)
12-12 10:43:41.995: E/AndroidRuntime(31144):    at com.worklight.wlclient.api.WLPush.access$400(WLPush.java:113)
12-12 10:43:41.995: E/AndroidRuntime(31144):    at com.worklight.wlclient.api.WLPush$3.onReceive(WLPush.java:538)
12-12 10:43:41.995: E/AndroidRuntime(31144):    at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:861)
12-12 10:43:41.995: E/AndroidRuntime(31144):    ... 8 more

【问题讨论】:

【参考方案1】:

这是由于同步问题。 WLPush.java 中有一个名为“pendingPushEvents”的资源。并且有两种方法可以更新这个。

    dispatchPendings(); onMessage();

在我的应用程序中,这两个方法同时被两个线程调用。所以资源被两个线程同时更新,导致了这种情况。

【讨论】:

也许吧。你能用你写的触发这个的原因生成一个示例应用程序吗?开发团队将尝试对其进行调试。 好吧。该项目相当复杂,抽象一个演示并不容易。我将两个线程的两个stacktrace打印出来,看看我能做什么。

以上是关于Worklight 推送导致 ConcurrentModificationException的主要内容,如果未能解决你的问题,请参考以下文章

多用户的 Worklight 推送通知

关于 Worklight 中的推送通知?

发送推送通知时出现 Worklight 错误

Worklight 6.1 中的默认推送通知声音

Worklight 6.2 - 推送通知 - 是不是可以更改 userSubscription.userId?

Worklight 的临时推送通知和开发