私はLiveQuery for Parse Androidを使用して、イベント、つまりオブジェクトの作成を待機しています。オブジェクトが作成されると、それを私のリストの先頭に追加したい。リスニングパートは機能しているようですが、受け取ったJSONオブジェクトをどうすればいいのか分かりません。特に、私はこのチュートリアルを、以下のホストとしてBack4Appを使用しています:https://docs.back4app.com/docs/android/live-query/Android用Parse LiveQueryを使用して、自動的に新しいオブジェクトをRecyclerAdapterに追加する方法はありますか?
のGradle:
compile 'com.google.code.gson:gson:2.8.1'
compile 'com.github.tgio:parse-livequery:1.0.3'
私は別のスレッドでのネットワーク操作を実行し、することが可能である非同期タスクを持っています希望JSONオブジェクトを取得します
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;
}
}
オブジェクトが作成された後、私は単純に、この非同期タスクを呼び出す:
message.saveInBackground(new SaveCallback() {
@Override
public void done(ParseException e) {
// Listen for messages and update UI
new UpdateTask().execute();
}
});
私のメッセージクラスは、この(私はKotlinを使用し、それ以外てることは違いはありません)のようになります。JSONオブジェクトを使用すると
@ParseClassName("Message")
class Message : ParseObject() {
/* Message Pointers */
val author by ParseDelegate<ParseObject>()
val contact by ParseDelegate<Contact>()
/* Message Content */
val messageText by ParseDelegate<String>()
}
、私はのバージョンに変換することができるはずです私のローカルオブジェクトを作成し、それをリストに追加してください。私は上記の試みを示しましたが、オブジェクトは作成後に表示されません。私はまだリフレッシュする必要があります。私はLog.e(getClass().toString(), object2.getMessageText());
を印刷するとき、私は、すなわち、エラーがローカルオブジェクトが正しくJSONから作成されていないということです把握私が手
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)
:
をさらに悪いことに、すべてのカップルの時間が、私はこのエラーを取得します
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)
オブジェクトのデバッグ: