2017-09-16 3 views
0

J'utilise LiveQuery for Parse Android pour écouter les événements, c'est-à-dire la création d'un objet. Lorsque l'objet est créé, je veux l'ajouter au début de ma liste. La partie écoute semble fonctionner mais je ne sais pas exactement quoi faire avec l'objet JSON reçu. En particulier, je suis ce tutoriel et en utilisant Back4App comme hôte: https://docs.back4app.com/docs/android/live-query/Comment puis-je utiliser Parse LiveQuery pour Android pour ajouter automatiquement de nouveaux objets à mon RecyclerAdapter?

Gradle:

compile 'com.google.code.gson:gson:2.8.1' 
compile 'com.github.tgio:parse-livequery:1.0.3' 

j'ai une tâche Async qui exécute l'opération de réseau sur un thread séparé et est capable de récupérer les objets JSON souhaités:

private class UpdateTask extends AsyncTask<String, String, String> { 
    protected String doInBackground(final String... string) { 
     Log.e(getClass().getName(), "ASYNC"); 

     // Subscription 
     final Subscription sub = new BaseQuery.Builder("Message") 
       .build() 
       .subscribe(); 

     Log.e(getClass().getName(), String.valueOf(sub.isSubscribed())); 

     sub.on(LiveQueryEvent.CREATE, new OnListener() { 
      @Override 
      public void on(final JSONObject object) { 
       Log.e(getClass().getName(), object.toString()); 
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         System.out.println("JSONObject" + object.toString()); 
         // {"op":"create","clientId":13,"requestId":0,"object":{"conversationObject":{"__type":"Pointer","className":"Conversation","objectId":"lZsj4dPCvb"},"messageText":"What's your phone number?","author":{"__type":"Pointer","className":"_User","objectId":"2E0bbd3oSD"},"createdAt":"2017-09-15T15:40:39.303Z","updatedAt":"2017-09-15T15:40:39.303Z","__type":"Object","className":"Message","objectId":"7A4RHttAEr"}} 

         // TODO: Take JSON object, convert to POJO, add to mMessages, notify data adapter 
         String mJsonString = object.toString(); 
         JsonParser parser = new JsonParser(); 
         JsonElement mJson = parser.parse(mJsonString); 
         Gson gson = new Gson(); 
         Message object2 = gson.fromJson(mJson, Message.class); 

         mMessages.add(0, object2); 
         adapter.notifyDataSetChanged(); 

        } 
       }); 
      } 
     }); 

     return null; 
    } 

} 

-je appeler cette tâche Async après qu'un objet est créé, il suffit:

message.saveInBackground(new SaveCallback() { 
@Override 
public void done(ParseException e) { 

    // Listen for messages and update UI 
    new UpdateTask().execute(); 
} 
}); 

Ma classe de message ressemble à ceci (j'utilise Kotlin, mais ne les fait pas de différence):

@ParseClassName("Message") 
class Message : ParseObject() { 

    /* Message Pointers */ 
    val author by ParseDelegate<ParseObject>() 
    val contact by ParseDelegate<Contact>() 

    /* Message Content */ 
    val messageText by ParseDelegate<String>() 

} 

Avec l'objet JSON, je devrais être capable de le transformer en une version de mon objet local et l'ajouter ensuite à la liste, et j'ai montré ma tentative ci-dessus, mais l'objet n'apparaît pas après l'avoir créé. Je dois encore me rafraîchir.

Pire encore, chaque couple de fois je reçois cette erreur:

09 - 16 12: 05: 13.907 10004 - 10004/com.sourcey.materialloginexample E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.sourcey.materialloginexample, PID: 10004 
java.lang.NullPointerException: Attempt to invoke interface method 'void java.util.List.add(int, java.lang.Object)' 
on a null object reference 
at com.sourcey.materiallogindemo.activity.MessageActivity$UpdateTask$1$1.run(MessageActivity.java: 213) 
at android.os.Handler.handleCallback(Handler.java: 751) 
at android.os.Handler.dispatchMessage(Handler.java: 95) 
at android.os.Looper.loop(Looper.java: 154) 
at android.app.ActivityThread.main(ActivityThread.java: 6119) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java: 886) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java: 776) 

je figure l'erreur est que l'objet local n'est pas créé à partir du JSON correctement, à savoir, quand j'imprimer Log.e(getClass().toString(), object2.getMessageText()); je reçois:

09 - 16 12: 15: 31.741 20252 - 20252/com.sourcey.materialloginexample E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.sourcey.materialloginexample, PID: 20252 
java.lang.NullPointerException: println needs a message 
at android.util.Log.println_native(Native Method) 
at android.util.Log.e(Log.java: 236) 
at com.sourcey.materiallogindemo.activity.MessageActivity$UpdateTask$1$1.run(MessageActivity.java: 213) 
at android.os.Handler.handleCallback(Handler.java: 751) 
at android.os.Handler.dispatchMessage(Handler.java: 95) 
at android.os.Looper.loop(Looper.java: 154) 
at android.app.ActivityThread.main(ActivityThread.java: 6119) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java: 886) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java: 776) 

objet Debug:

enter image description here

Répondre

0

S'il vous plaît utiliser le client liveQuery officiel d'android. ParseLiveQueryAndroid

Au lieu d'obtenir un objet JSON, vous obtenez un ParseObject