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: