2015-01-25 11 views
5

Sto eseguendo alcune indagini sul threading Realm e sul problema riscontrato.Scrittura e lettura tra thread con Android Realm

In questo semplice esempio sono presenti 2 oggetti Thread, uno per la scrittura e il secondo per la lettura. Il lettore Thread ottiene il conteggio degli oggetti scritti sempre come 0, ma all'interno dello scope del writer lo size() per gli elementi nel DB è corretto. Quando rilancio l'app, il lettore ottiene il primo conteggio ok prima di qualsiasi inserimento.

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

C'è qualcosa da fare perché funzioni?

Grazie.

risposta

8

Emanuele dal Regno qui.

cosa si sta descrivendo è il comportamento previsto :) Dal momento che il thread di lettura non dispone di un Looper, non ha alcun modo di ricevere le notifiche dal thread di lettura e non sarà mai a meno che non si esegue l'aggiornamento manualmente un refresh.

Nel repository out abbiamo diversi esempi (per non parlare dei test di unità) utilizzando thread con e senza Looper, che illustrano le migliori pratiche attuali.

+0

Tecnicamente '.refresh()' non esiste più, ma è possibile emulare un aggiornamento automatico "thread looper" utilizzando ['waitForChange()/stopWaitForChange()'] (https://gist.github.com/cmelchior/8786ec511f7e1f47673935a26f568106) – EpicPandaForce