Ich benutze LiveQuery für Parse Android, um auf Ereignisse zu warten, d. H. Die Erstellung eines Objekts. Wenn das Objekt erstellt wird, möchte ich es am Anfang meiner Liste hinzufügen. Der hörende Teil scheint zu funktionieren, aber ich bin mir nicht sicher, was genau mit dem JSON-Objekt zu tun ist, das empfangen wird. Insbesondere verfolge ich dieses Tutorial und mit Back4App als Wirt: https://docs.back4app.com/docs/android/live-query/Wie kann ich Parse LiveQuery für Android verwenden, um automatisch neue Objekte zu meinem RecyclerAdapter hinzuzufügen?
Gradle:
compile 'com.google.code.gson:gson:2.8.1'
compile 'com.github.tgio:parse-livequery:1.0.3'
Ich habe eine Async Aufgabe, die auf einem separaten Thread den Netzbetrieb läuft und in der Lage, abrufen der gewünschten JSON-Objekte:
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;
}
}
nenne ich diese Async Aufgabe, nachdem ein Objekt erstellt wird, einfach:
message.saveInBackground(new SaveCallback() {
@Override
public void done(ParseException e) {
// Listen for messages and update UI
new UpdateTask().execute();
}
});
Meine Botschaft Klasse sieht wie folgt aus (ich verwende Kotlin, aber sonst keinen Unterschied macht):
@ParseClassName("Message")
class Message : ParseObject() {
/* Message Pointers */
val author by ParseDelegate<ParseObject>()
val contact by ParseDelegate<Contact>()
/* Message Content */
val messageText by ParseDelegate<String>()
}
Mit dem JSON-Objekt, sollte ich in der Lage sein, es in eine Version zu konvertieren mein lokales Objekt und dann an die Liste anhängen, und ich habe meinen Versuch oben gezeigt, aber das Objekt erscheint nicht nach dem Erstellen. Ich muss noch auffrischen.
Schlimmer noch, alle paar Male, die ich bekomme diese Fehlermeldung:
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)
Ich stelle dar, der Fehler ist, dass die lokale Objekt nicht aus dem JSON richtig erstellt wird, das heißt, wenn ich Log.e(getClass().toString(), object2.getMessageText());
drucke ich bekommen:
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)
Objekt Debug: