2014-09-03 49 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(); 

這依靠你來管理你的頻道陣列,但不會莫名其妙地崩潰。