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

Posted

技术标签:

【中文标题】如何使用 Parse LiveQuery for Android 自动将新对象添加到我的 RecyclerAdapter?【英文标题】:How can I use Parse LiveQuery for Android to automatically add new objects to my RecyclerAdapter? 【发布时间】:2017-09-16 11:59:28 【问题描述】:

我正在使用 LiveQuery for Parse android 来监听事件,即对象的创建。创建对象后,我想将其添加到列表的开头。监听部分似乎正在工作,但我不确定如何处理收到的 JSON 对象。特别是,我正在关注本教程并使用 Back4App 作为主机:https://docs.back4app.com/docs/android/live-query/

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,但其他方面并没有什么不同):

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

对象调试:

【问题讨论】:

【参考方案1】:

请使用安卓官方liveQuery客户端。 ParseLiveQueryAndroid

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

【讨论】:

以上是关于如何使用 Parse LiveQuery for Android 自动将新对象添加到我的 RecyclerAdapter?的主要内容,如果未能解决你的问题,请参考以下文章

解析 LiveQuery 不起作用

如何在 Parse Dashboard 日志视图中显示日志

PrettyPhoto 不适用于 livequery

Livequery 和 each()

jQuery livequery 插件的替代品?

不推荐使用 livequery