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的主要内容,如果未能解决你的问题,请参考以下文章