2017-09-16 3 views
0

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:

enter image description here

Antwort

0

Bitte verwenden Sie den offiziellen LiveQuery-Client von Android. ParseLiveQueryAndroid

Statt ein JSON-Objekt zu bekommen, erhalten Sie eine ParseObject

Verwandte Themen