2016-05-28 14 views
1

Ich versuche, einen asynchronen Schreib mit Realm zu tun, und ich brauche, um den Wert zu übergeben, wie dies die executeTransaction Methode beharrte werden:Kann ExecuteTransactionAsync Android Realm

public void updateAsync(final long id, final String title, final String content, final int color) { 

    mRealm.executeTransactionAsync(new Realm.Transaction() { 
     @Override 
     public void execute(Realm realm) { 
      Note note = getNoteById(id); 
      if (note != null){ 
       note.setTitle(title); 
       note.setContent(content); 
       note.setColor(color);      
       realm.copyToRealmOrUpdate(note); 
      } 

     } 
    }, new Realm.Transaction.OnSuccess() { 
     @Override 
     public void onSuccess() { 
      Log.d(LOG_TAG, "Note Updated"); 
     } 
    }, new Realm.Transaction.OnError() { 
     @Override 
     public void onError(Throwable error) { 
      Log.d(LOG_TAG, error.getMessage()); 
     } 
    }); 


} 

Der obige Code-Block mit dem Fehler fehlgeschlagen : Realm Zugriff von falschem Thread. Auf Realm-Objekte kann nur in dem Thread zugegriffen werden, in dem sie erstellt wurden.

SO meine Frage ist, wie kann ich Parameter an den Hintergrund Thread in Realm übergeben?

Antwort

0

Wenn executeTransactionAsync Aufruf der execute Block in einem Hintergrund-Thread ausgeführt wird, Objekte jeder Realm Zugriff von diesem Thread Bedarf an diesem Faden von der Realm-Instanz erstellt/abgefragt werden, die der von param execute ist.

Sie können den Parameter realm verwenden, um Abfragen auszuführen. Ändern Sie einfach Ihre getNoteById(id), um die Realm-Instanz als einen Parameter wie getNoteById(Realm realm, int id) zu nehmen, und verwenden Sie die realm Abfrage.

+0

Müssen Realm-Instanzen in onSuccess und onError geschlossen werden? –

+0

Hängt von Ihrem Anwendungsfall ab. Der im Transaktionsblock-Callback übergebene Realm muss nicht geschlossen werden, da er nicht von Ihnen erstellt wird. Realm wird sich darum kümmern oder es. Die von Ihnen erstellte Instanz vor dem Aufruf von executeTransactionAsync muss jedoch geschlossen werden. Es ist nicht notwendig, es in 'onSuccess' /' onError' zu schließen, Sie können es auch direkt nach dem Aufruf von 'executeTransactionAsync' erzeugen. Oder folge einfach dem normalen Muster, benutze 'onCreate' /' onDestroy' von activity, um 'getInstance' /' close' zu ​​machen. – beeender