如何使用Android的Parse LiveQuery自动将新对象添加到我的RecyclerAdapter?

问题描述:

我使用LiveQuery解析Android来侦听事件,即创建对象。创建对象时,我想将其添加到列表的开头。听力部分似乎正在工作,但我不确定如何处理收到的JSON对象。特别是,我下面这个教程,并使用Back4App作为主持人:https://docs.back4app.com/docs/android/live-query/如何使用Android的Parse LiveQuery自动将新对象添加到我的RecyclerAdapter?

摇篮:

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

我的消息类看起来像这样(我使用科特林,但在其他方面并没有做出区别):

@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) 

对象调试:

enter image description here

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

非但没有一个JSON对象,你会得到一个的parseObject