0

СитуацияPush уведомление об ошибке с Parse

Я реализовал толчок уведомление с Parse в ANDROID. Все отлично работает (я могу получить толчок/отправить и т.д.), единственное, что когда я устанавливаю мое приложение это происходит следующим образом:

  • если это первая установка когда-либо на устройстве: не проблема
  • если это не первая установка (это означает, что устройство уже сделало PARSE/GCM регистрацию) он генерирует сообщение об ошибке:

ошибка сгенерированного

02-12 11:12:28.054 15564-15579/com.hoxell.hoxellbrowser E/ParseCommandCache﹕ Failed to run command. 
com.parse.ParseException: at least one ID field (installationId,deviceToken) must be specified in this operation 
     at com.parse.ParseCommand.onPostExecute(ParseCommand.java:404) 
     at com.parse.ParseRequest$5.then(ParseRequest.java:342) 
     at com.parse.ParseRequest$5.then(ParseRequest.java:339) 
     at bolts.Task$10.run(Task.java:486) 
     at bolts.BoltsExecutors$ImmediateExecutor.execute(BoltsExecutors.java:97) 
     at bolts.Task.completeAfterTask(Task.java:482) 
     at bolts.Task.continueWithTask(Task.java:358) 
     at bolts.Task.continueWithTask(Task.java:369) 
     at bolts.Task$8.then(Task.java:415) 
     at bolts.Task$8.then(Task.java:407) 
     at bolts.Task$10.run(Task.java:486) 
     at bolts.BoltsExecutors$ImmediateExecutor.execute(BoltsExecutors.java:97) 
     at bolts.Task.completeAfterTask(Task.java:482) 
     at bolts.Task.access$200(Task.java:27) 
     at bolts.Task$6.then(Task.java:351) 
     at bolts.Task$6.then(Task.java:348) 
     at bolts.Task.runContinuations(Task.java:515) 
     at bolts.Task.access$600(Task.java:27) 
     at bolts.Task$TaskCompletionSource.trySetResult(Task.java:570) 
     at bolts.Task$TaskCompletionSource.setResult(Task.java:604) 
     at bolts.Task$10$1.then(Task.java:498) 
     at bolts.Task$10$1.then(Task.java:490) 
     at bolts.Task$9.run(Task.java:453) 
     at bolts.BoltsExecutors$ImmediateExecutor.execute(BoltsExecutors.java:97) 
     at bolts.Task.completeImmediately(Task.java:449) 
     at bolts.Task.access$100(Task.java:27) 
     at bolts.Task$5.then(Task.java:316) 
     at bolts.Task$5.then(Task.java:313) 
     at bolts.Task.runContinuations(Task.java:515) 
     at bolts.Task.access$600(Task.java:27) 
     at bolts.Task$TaskCompletionSource.trySetResult(Task.java:570) 
     at bolts.Task$TaskCompletionSource.setResult(Task.java:604) 
     at bolts.Task$10$1.then(Task.java:498) 
     at bolts.Task$10$1.then(Task.java:490) 
     at bolts.Task$9.run(Task.java:453) 
     at bolts.BoltsExecutors$ImmediateExecutor.execute(BoltsExecutors.java:97) 
     at bolts.Task.completeImmediately(Task.java:449) 
     at bolts.Task.access$100(Task.java:27) 
     at bolts.Task$5.then(Task.java:316) 
     at bolts.Task$5.then(Task.java:313) 
     at bolts.Task.runContinuations(Task.java:515) 
     at bolts.Task.access$600(Task.java:27) 
     at bolts.Task$TaskCompletionSource.trySetResult(Task.java:570) 
     at bolts.Task$TaskCompletionSource.setResult(Task.java:604) 
     at bolts.Task$10$1.then(Task.java:498) 
     at bolts.Task$10$1.then(Task.java:490) 
     at bolts.Task$9.run(Task.java:453) 
     at bolts.BoltsExecutors$ImmediateExecutor.execute(BoltsExecutors.java:97) 
     at bolts.Task.completeImmediately(Task.java:449) 
     at bolts.Task.continueWith(Task.java:323) 
     at bolts.Task.continueWith(Task.java:334) 
     at bolts.Task$10.run(Task.java:490) 
     at bolts.BoltsExecutors$ImmediateExecutor.execute(BoltsExecutors.java:97) 
     at bolts.Task.completeAfterTask(Task.java:482) 
     at bolts.Task.access$200(Task.java:27) 
     at bolts.Task$6.then(Task.java:351) 
     at bolts.Task$6.then(Task.java:348) 
     at bolts.Task.runContinuations(Task.java:515) 
     at bolts.Task.access$600(Task.java:27) 
     at bolts.Task$TaskCompletionSource.trySetResult(Task.java:570) 
     at bolts.Task$TaskCompletionSource.setResult(Task.java:604) 
     at bolts.Task$10$1.then(Task.java:498) 
     at bolts.Task$10$1.then(Task.java:490) 
     at bolts.Task$9.run(Task.java:453) 
     at bolts.BoltsExecutors$ImmediateExecutor.execute(BoltsExecutors.java:97) 
     at bolts.Task.completeImmediately(Task.java:449) 
     at bolts.Task.continueWith(Task.java:323) 
     at bolts.Task.continueWith(Task.java:334) 
     at bolts.Task$10.run(Task.java:490) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
     at java.lang.Thread.run(Thread.java:864) 

Да, это генерирует его, но приложение не падает! и приложение все еще работает: push-уведомления тоже, но вы можете понять, что это не на 100% надежнее.

E/ParseCommandCache﹕ Failed to run command. 
com.parse.ParseException: at least one ID field (installationId,deviceToken) must be specified in this operation 

Что он хочет ..? Что мне делать? В чем причина проблемы? Вот мой код:

Application.java

@Override 
public void onCreate() { 
    super.onCreate(); 

    // Initialize the Parse SDK. 
    Parse.initialize(this, "x", "x"); 

    // Specify an Activity to handle all pushes by default. 
    PushService.setDefaultPushCallback(this, MainActivity.class); 

    ParseInstallation.getCurrentInstallation().saveInBackground(); 

} 

В моей mainActivity я просто сцепить deviceToken (в моем случае это installationId) в моем UserAgent: и эта работа тоже хорошо! Даже если сгенерирована ошибка, идентификатор установки вставлен в userAgent.

MainActivity.java

deviceToken = ParseInstallation.getCurrentInstallation().getInstallationId(); 
webSettings.setUserAgentString(userAgent + " ||" + deviceToken); 

Могу ли я сделать какие-либо ошибки в мой код?

Спасибо

+0

Насколько я помню, вам не нужно сохранять установку при использовании setDefaultPushCallback. Попробуйте удалить сохранение установки и посмотреть, все ли это происходит. – cYrixmorten

+0

@cYrixmorten Я удалил его, и похоже, что он работает. Но скажите мне, не является ли основной задачей SaveInBackground, чтобы заставить Parse работать? – ernestocattaneo

+0

Дело в том, что setDefaultPushCallback автоматически сохранит установку для вас. Не могу вспомнить, где я его нашел, но на каком-то форуме было сказано, что это поведение. Я предполагаю, что второе сохранение сразу после (без первого завершенного) приведет к установке в плохом состоянии, вызвав нефатальную ошибку msg. – cYrixmorten

ответ

0

Попробуйте следующее ниже:

ParseInstallation.getCurrentInstallation().saveInBackground(new SaveCallback() 
    { 
     @Override 
     public void done(ParseException e) 
     { 
      PushService.setDefaultPushCallback(Application.this, MainActivit.class); 
     } 
    }); 
+0

по-моему это не имеет большого смысла. – ernestocattaneo

+0

замените ваш setDefaultPushCallback на приведенное выше в onCreate ... –

0

Насколько я помню, вам не нужно, чтобы сохранить установку при использовании setDefaultPushCallback. Попробуйте удалить сохранение установки и посмотреть, все ли это происходит.

setDefaultPushCallback автоматически сохранит установку для вас. Не могу вспомнить, где я его нашел, но на каком-то форуме было сказано, что это поведение. Я предполагаю, что второе сохранение сразу после (без первого завершенного) приведет к установке в плохом состоянии, вызвав нефатальную ошибку msg.