【问题标题】:Parse Android: subscribe/unsubscribe not really coherent with onlineParse Android:订阅/取消订阅与在线并不完全一致
【发布时间】:2014-09-03 15:18:48
【问题描述】:

我们正在为我们的 android 客户端使用 Parse,但缓存有问题。

每台设备都有一个他们注册的唯一频道。如果我上网并在数据浏览器中删除频道,设备仍然认为它已经注册。如果我为频道调用订阅,则似乎没有进行此调用,我的猜测是它检查本地缓存,并且由于这说它已经注册,因此它将进行此调用。

如果我调用此方法 PushService.getSubscriptions 它会给我一个与在线内容不一致的频道列表。某处说 PushService.getSubscriptions 在本地缓存,这真的很奇怪吗?

然后我尝试做这样的事情来确保它总是更新到最新:

    PushService.setDefaultPushCallback(this, null);
    Set<String> channels = PushService.getSubscriptions(_context);
    for(String channel : channels){
        PushService.unsubscribe(this, channel);
    }
    PushService.setDefaultPushCallback(this, RD4MainV4Activity.class);
    PushService.subscribe(this, licenseKeyValue, RD4MainV4Activity.class);

但是我得到了错误。而且我尝试过以不同的顺序进行这些操作等,但无论我做什么,我都会遇到问题。

09-03 17:13:45.494: E/AndroidRuntime(29029): java.lang.RuntimeException: java.lang.IllegalArgumentException: Operation is invalid after previous operation.
09-03 17:13:45.494: E/AndroidRuntime(29029):    at com.parse.PushRouter$8$1.run(PushRouter.java:235)
09-03 17:13:45.494: E/AndroidRuntime(29029):    at android.os.Handler.handleCallback(Handler.java:733)
09-03 17:13:45.494: E/AndroidRuntime(29029):    at android.os.Handler.dispatchMessage(Handler.java:95)
09-03 17:13:45.494: E/AndroidRuntime(29029):    at android.os.Looper.loop(Looper.java:136)
09-03 17:13:45.494: E/AndroidRuntime(29029):    at android.app.ActivityThread.main(ActivityThread.java:5001)
09-03 17:13:45.494: E/AndroidRuntime(29029):    at java.lang.reflect.Method.invokeNative(Native Method)
09-03 17:13:45.494: E/AndroidRuntime(29029):    at java.lang.reflect.Method.invoke(Method.java:515)
09-03 17:13:45.494: E/AndroidRuntime(29029):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
09-03 17:13:45.494: E/AndroidRuntime(29029):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
09-03 17:13:45.494: E/AndroidRuntime(29029):    at dalvik.system.NativeStart.main(Native Method)
09-03 17:13:45.494: E/AndroidRuntime(29029): Caused by: java.lang.IllegalArgumentException: Operation is invalid after previous operation.
09-03 17:13:45.494: E/AndroidRuntime(29029):    at com.parse.ParseAddUniqueOperation.apply(ParseAddUniqueOperation.java:96)
09-03 17:13:45.494: E/AndroidRuntime(29029):    at com.parse.ParseObject.performOperation(ParseObject.java:2734)
09-03 17:13:45.494: E/AndroidRuntime(29029):    at com.parse.ParseObject.addAllUnique(ParseObject.java:2850)
09-03 17:13:45.494: E/AndroidRuntime(29029):    at com.parse.ParseObject.addUnique(ParseObject.java:2835)
09-03 17:13:45.494: E/AndroidRuntime(29029):    at com.parse.PushRouter.subscribe(PushRouter.java:618)
09-03 17:13:45.494: E/AndroidRuntime(29029):    at com.parse.PushRouter$1.then(PushRouter.java:72)
09-03 17:13:45.494: E/AndroidRuntime(29029):    at com.parse.PushRouter$1.then(PushRouter.java:69)
09-03 17:13:45.494: E/AndroidRuntime(29029):    at com.parse.Task$10.run(Task.java:448)
09-03 17:13:45.494: E/AndroidRuntime(29029):    at com.parse.Task$ImmediateExecutor.execute(Task.java:673)
09-03 17:13:45.494: E/AndroidRuntime(29029):    at com.parse.Task.completeImmediately(Task.java:444)
09-03 17:13:45.494: E/AndroidRuntime(29029):    at com.parse.Task.continueWith(Task.java:318)
09-03 17:13:45.494: E/AndroidRuntime(29029):    at com.parse.Task.continueWith(Task.java:329)
09-03 17:13:45.494: E/AndroidRuntime(29029):    at com.parse.Task$8.then(Task.java:381)
09-03 17:13:45.494: E/AndroidRuntime(29029):    at com.parse.Task$8.then(Task.java:373)
09-03 17:13:45.494: E/AndroidRuntime(29029):    at com.parse.Task$11.run(Task.java:481)
09-03 17:13:45.494: E/AndroidRuntime(29029):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
09-03 17:13:45.494: E/AndroidRuntime(29029):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
09-03 17:13:45.494: E/AndroidRuntime(29029):    at java.lang.Thread.run(Thread.java:841)

我的梦想是我可以获得该设备的在线版本。然后检查它是否正确,如果频道丢失或设备注册了错误的频道,则修复此问题。

我可以通过任何方式检查吗?

【问题讨论】:

  • 我现在已经尝试了很多类似 ParseInstallation.getCurrentInstallation().refresh();和 ParseInstallation.getCurrentInstallation().fetch();我可以看到他们下载了列表,但他们没有删除错误的频道。取消注册也只是删除在线的东西。因此,如果我的本地列表中有更多并且它们不在线,它可以工作,但如果它们在线,则无法删除它们。
  • 你解决了这个问题吗?我也有类似的问题...

标签: android parse-platform


【解决方案1】:

我遇到了类似的问题,但通过一点技巧就能解决。

使用当前版本的 Parse(撰写本文时为 1.9.2),订阅频道的方式是使用 ParsePush.subscribeInBackground(channelname)。此方法以原子方式将字符串“channelname”添加到用户安装对象中名为“channels”的字符串数组中,但无论如何,对我来说,抛出了上面给出的相同错误:

java.lang.RuntimeException: java.lang.IllegalArgumentException: Operation is invalid after previous operation.

我能够解决这个问题的方法是编写自己的 subscribeInBackground 版本,类似于:

ParseInstallation.getCurrentInstallation().put("channels",
                Arrays.asList(new String[]{
                        "channelname"
                }));
ParseInstallation.getCurrentInstallation().saveInBackground();

要取消订阅,只需执行相反的操作:

ParseInstallation.getCurrentInstallation().put("channels",
                Arrays.asList(new String[]{})); //Put the empty list to unsubcribe!
        ParseInstallation.getCurrentInstallation().saveInBackground();

这依赖于你来管理你的频道数组,但不会莫名其妙地崩溃。

【讨论】:

    猜你喜欢
    • 2015-07-17
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    • 2015-06-30
    • 1970-01-01
    • 2022-01-19
    • 2012-03-14
    • 2016-07-27
    相关资源
    最近更新 更多