2015-01-25 6 views
5

Ich führe einige Untersuchungen von Realm Threading und aufgetretene Problem.Schreiben und Lesen zwischen Threads mit Android Realm

In diesem einfachen Beispiel habe ich 2 Thread Objekte, eines zum Schreiben und das zweite zum Lesen. Der Leser Thread erhält die Anzahl der geschriebenen Objekte immer als 0, aber innerhalb des Schreiberumfangs ist die size() für Objekte in DB korrekt. Wenn ich die App neu starte, erhält der Leser die erste Zählung vor jeder Einfügung.

Thread writer = new Thread() { 

    @Override 
    public void run() { 
     while (mRunning) { 
      try { 
       Realm r = Realm.getInstance(context, "test_db"); 
       r.beginTransaction(); 

       TestData data = r.createObject(TestData.class); 

       r.commitTransaction(); 

       Logger.e("WRITER THREAD COUNT: " + 
        r.where(TestData.class).findAll().size()); 

       sleep(LATENCY); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
}; 

writer.setPriority(Thread.MAX_PRIORITY); 
writer.start(); 

Thread reader = new Thread() { 

    @Override 
    public void run() { 
     while (mRunning) { 
      try { 
       Logger.e("READING THREAD COUNT: " + Realm.getInstance(context, 
         "test_db").where(TestData.class).findAll().size()); 

       sleep(LATENCY); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
}; 

reader.setPriority(Thread.MAX_PRIORITY); 
reader.start(); 

Gibt es etwas zu tun, damit dies funktioniert?

Danke.

Antwort

8

Emanuele aus Reich hier.

Was Sie beschreiben, ist erwartetes Verhalten :) Da der Reader-Thread keine Looper hat, hat er keine Möglichkeit, Benachrichtigungen vom Leser-Thread zu erhalten und wird nie aktualisiert, wenn Sie eine refresh manuell ausführen.

In out Repo haben wir mehrere Beispiele (ganz zu schweigen von Komponententests) mit Threads mit und ohne Looper, die die aktuellen Best Practices veranschaulicht.

+0

Technisch '.refresh()' existiert nicht mehr, aber Sie können ein "looper thread" Auto-Update mit ['waitForChange()/stopWaitForChange()'] emulieren (https://gist.github.com/cmelchior/8786ec511f7e1f47673935a26f568106) – EpicPandaForce