2016-05-06 14 views
6

Ho letto molti post su questo argomento, ma è ancora un po 'oscuro per me. Comprendo che non è possibile accedere agli oggetti di classe o realm Realm attraverso thread diversi, quindi mi chiedo quale sia il modo ottimale per gestirli.Accesso al dominio attraverso i thread con rxjava e dagger2

Ho un servizio che avvia una discussione. Quel thread funziona in background (incluso il lavoro tramite rxjava su Schedulers.io). Ora ad un certo punto voglio salvare alcuni dati nel regno che vive in una classe DataManager. Inizialmente stavo usando Dagger2 per iniettare Realm nella mia classe DataManager (che è stata iniettata direttamente nel servizio). Tuttavia, ciò non funzionerà poiché l'iniezione è stata eseguita sul thread principale, pertanto Realm.getDefaultInstance() è collegato al thread principale ma è accessibile in DataManager da un thread diverso.

L'unica opzione possibile che posso pensare è chiamare Realm.getDefaultInstance() e realm.close() all'inizio e alla fine di ogni metodo che sta eseguendo una transazione. Non mi dispiace farlo, ma mi chiedo se ci sarà un successo in termini di prestazioni chiamando lo Realm.getDefaultInstance() ogni volta che voglio salvare un oggetto. C'è un modo migliore per farlo? Grazie in anticipo.

+0

'Realm.getDefaultInstance()' sarà un po 'lento se è la prima istanza tra tutti i thread. Altrimenti, ritorna istantaneamente dal momento che Realm sta memorizzando nella cache gli schemi internamente. Vedi https://github.com/realm/realm-java/issues/2231 – beeender

+0

FYI Ho deciso di abbandonare il Realm per il mio caso d'uso specifico. Fondamentalmente avevo bisogno di fare un 'copyFromRealm' su tutti i miei oggetti recuperati in modo che potessi passarli attraverso i thread e quindi il beneficio del live object era praticamente fuori dalla porta. Era anche una vernice per gestire le istanze di realm di chiusura all'interno delle classi di helper. Sono sicuro che c'è un modo migliore per gestire questo, ma abbiamo deciso di attenerci a sqlite e un orm. – pat

risposta

0

ho affrontato il problema di threading durante l'utilizzo di Reame in una delle mie applicazioni creando una classe DatabaseManager che ho iniettato nelle Attività e servizi utilizzando Dagger 2.

Così, per esempio se ho un'entità Task, la classe DatabaseManager aveva un metodo void update(Task task) che otterrebbe l'istanza di Realm predefinita, preleva lo Task con l'ID specificato dal database di Realm, aggiorna l'istanza Task ottenuta in un blocco di Transaction, esegue realm.copyFromRealm(updatedTask); e chiude l'istanza di Realm alla fine del metodo.

Realm realm = Realm.getDefaultInstance(); 
     realm.executeTransaction(new Realm.Transaction() { 
      @Override 
      public void execute(Realm realm) { 
       // fetch the object from Realm database and update it as required. 

       //https://realm.io/docs/java/latest/api/io/realm/Realm.html#copyFromRealm-E- 
       // Makes an unmanaged in-memory copy of an already persisted RealmObject. 
       realm.copyFromRealm(task); 

       } 
      } 
     }); 
realm.close(); 

Ha funzionato per me. Se c'è un approccio migliore mi piacerebbe saperne di più.