我怎样才能使用Parse LiveQuery的Android自动添加新的对象到我的RecyclerAdapter?

我使用LiveQuery解析Android来监听事件,即创建一个对象。 当对象被创建时,我想把它添加到我的列表的开始。 听力部分似乎正在工作,但我不知道如何处理收到的JSON对象。 特别是,我正在学习本教程,并使用Back4App作为主机: https ://docs.back4app.com/docs/android/live-query/

摇篮:

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; } } 

创建对象后,我将这个Async任务称为:

 message.saveInBackground(new SaveCallback() { @Override public void done(ParseException e) { // Listen for messages and update UI new UpdateTask().execute(); } }); 

我的消息类看起来像这样(我正在使用Kotlin,但不会有所作为):

 @ParseClassName("Message") class Message : ParseObject() { /* Message Pointers */ val author by ParseDelegate<ParseObject>() val contact by ParseDelegate<Contact>() /* Message Content */ val messageText by ParseDelegate<String>() } 

使用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) 

我认为错误的是本地对象不是从JSON正确创建,即,当我打印Log.e(getClass().toString(), object2.getMessageText()); 我得到:

 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) 

对象调试:

在这里输入图像描述

请使用android官方的liveQuery客户端。 ParseLiveQueryAndroid

而不是得到一个JSON对象,你会得到一个ParseObject