2016-02-15 25 views
7

Ho un problema con la comprensione di ciò che è buona pratica alla chiusura dell'istanza di Realm, ogni volta che eseguo una transazione asincrona.Realm - come chiudere l'istanza del realm con una transazione asincrona

Nella mia applicazione ho molti controller e non li passo all'istanza di Realm dall'attività, invece ne creo uno nuovo ogni volta che è necessario e lo chiudo non appena il lavoro è terminato.

Tuttavia recentemente ho scoperto che non funziona correttamente, se sto chiudendo l'istanza del realm quando sta eseguendo una transazione asincrona.

Realm cacheRealm = RealmDelegate.getCacheRealm(); 

cacheRealm.executeTransaction(realm -> { 
    doSomeWork(response); 
    realm.copyToRealmOrUpdate(response); 
}, callback); 
cacheRealm.close(); 

Questo codice è sopra un grosso problema, che non è mai richiamata lanciato, dal momento che sto chiudendo esempio regno prima operazione è terminata.

Pertanto non sono sicuro di come dovrei gestire questa situazione. Dovrei passare l'istanza dell'oggetto Realm in ogni controller da attività o frammenti e gestire la chiusura delle istanze di realm solo da quelle parti? O forse ci sono altre soluzioni più eleganti a questo problema?

Un'altra cosa che mi sto chiedendo è che cosa accadrà, se non chiuderò il Realm db, e c'è un modo per verificare se tutte le istanze di Realm sono state chiuse?

risposta

4

È possibile chiudere il reame nel callback? Hai sia un errore e il successo di callback per collegare in: https://realm.io/docs/java/latest/#asynchronous-transactions

realm.executeTransactionAsync(new Realm.Transaction() { 
     @Override 
     public void execute(Realm bgRealm) { 
      User user = bgRealm.createObject(User.class); 
      user.setName("John"); 
      user.setEmail("[email protected]"); 
     } 
    }, new Realm.Transaction.OnSuccess() { 
     @Override 
     public void onSuccess() { 
      // Transaction was a success. 
     } 
    }, new Realm.Transaction.OnError() { 
     @Override 
     public void onError(Throwable error) { 
      // Transaction failed and was automatically canceled. 
     } 
    }); 
+0

Questo ha piccolo problema, dal momento che sto costruendo richiamata in altra classe, quindi avrei bisogno di creare un'istanza Realm laggiù. Ma immagino sia meglio che avere un'istanza in Activity o Fragment. Come per la seconda parte della domanda, c'è un modo per controllare se tutte le istanze sono state chiuse? –

+0

No, puoi usare 'Realm.isClosed' ma questo controllerà solo l'istanza sul thread corrente. –

+0

È possibile creare un altro callback e richiamare la richiamata originale passata da altre classi nel callback creato. – zaki50