2014-09-03 50 views
1

我们正在为我们的Android客户端使用Parse,并且存在缓存问题。解析Android:订阅/取消订阅与在线不完全相关

每个设备都有一个他们注册的唯一通道。如果我在网上进入并删除数据浏览器中的频道,设备仍然认为它已经注册。如果我打电话订阅频道看起来好像这个电话没有做,我的猜测是,它检查本地缓存,因为这表示它已经注册它将进行此调用。

如果我将此方法称为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) 

我的梦想是我可以得到该设备的在线版本。然后检查它是否正确,如果通道丢失或者是否有错误的通道注册到设备,请检查它是否正确。

我可以用任何方式检查吗?

+0

我现在已经尝试了很多像ParseInstallation.getCurrentInstallation()。refresh();和ParseInstallation.getCurrentInstallation()。fetch();我可以看到他们下载了这个列表,但他们并没有删除那些错误的频道。取消注册也只是删除在线的东西。因此,如果我的本地列表中有更多内容,并且它们不在线,它可以正常工作,但如果它们处于联机状态,则无法删除它 – Ludvig 2014-09-03 16:35:57

+0

你设法弄清楚了吗?我有类似的问题... – chetem 2014-10-24 14:33:42

回答

2

我遇到了类似的问题,但能够解决它与一点点的黑客。

使用Parse的当前版本(截至撰写本文时为1.9.2),您订阅频道的方式是使用ParsePush.subscribeInBackground(channelname)。这种方法原子将字符串“CHANNELNAME”来调用用户的安装对象的“通道”,但是,对我来说反正String数组,扔上面给出了同样的错误:

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(); 

这依靠你来管理你的频道阵列,但不会莫名其妙地崩溃。