2016-07-19 7 views
4

Ich möchte meine Realm-Instanz in executeTransactionAsync nach Abschluss der Ausführung schließen. Der Grund dafür ist, dass der Hauptthread meiner Anwendungen weiterhin eingefroren wird. Ich denke, der Grund dafür ist, dass die Hintergrund-Realm-Instanz nach Abschluss der Ausführung nicht geschlossen wird. Siehe meinen Code unten:Schließen Realm-Instanz nach Abschluss der Ausführung

realm.executeTransactionAsync(new Realm.Transaction() { 
        @Override 
        public void execute(Realm realm) { 
         // Execute realm code 
         realm.copyToRealmOrUpdate(myData); 
         // Can I close the realm instance here without getting an 
         // error? realm.close(); causes an error. 
        } 
       }, new Realm.Transaction.OnSuccess() { 
        @Override 
        public void onSuccess() { 
         Log.i("CB", "success"); 
         // looks like I cannot access the execute Realm 
         // instance here. 
         // Closing realm.getDefaultInstance does not change my issue 
        } 
       }, new Realm.Transaction.OnError() { 
        @Override 
        public void onError(Throwable error) { 
         Log.i("CB", "error - " + error.getMessage()); 
        } 
       }); 
      } 

Bitte beachten Sie meine Kommentare. Mein Anwendungsbildschirm wird nur schwarz. Die Ausführung wird erfolgreich abgeschlossen und onSuccess() wird aufgerufen, aber ich kann nicht auf die Realm-Instanz execute zugreifen, um sie von hier aus zu schließen.

Haben Sie Vorschläge, was ich ausprobieren kann? Mache ich etwas falsch?

Vielen Dank im Voraus.

EDIT

07-19 11:43:42.379 8146-8146/com.shortterminsurance.shortterm I/CB: success 
07-19 11:43:43.258 8146-8152/com.shortterminsurance.shortterm W/art: Suspending all threads took: 33.234ms 
07-19 11:43:43.266 8146-8156/com.shortterminsurance.shortterm I/art: Background partial concurrent mark sweep GC freed 476307(17MB) AllocSpace objects, 512(10MB) LOS objects, 40% free, 33MB/55MB, paused 7.261ms total 163.497ms 
07-19 11:43:44.131 8146-8156/com.shortterminsurance.shortterm I/art: Background sticky concurrent mark sweep GC freed 408160(9MB) AllocSpace objects, 459(15MB) LOS objects, 35% free, 35MB/55MB, paused 10.287ms total 147.823ms 
07-19 11:43:44.834 8146-8152/com.shortterminsurance.shortterm W/art: Suspending all threads took: 103.676ms 
07-19 11:43:44.848 8146-8156/com.shortterminsurance.shortterm W/art: Suspending all threads took: 13.424ms 

Das ist mein logcat nach meiner onSuccess aufgerufen wird. Ich denke, die Hintergrundinstanz von Realm in execute läuft aus irgendeinem Grund weiter :(.

+0

Warten Sie, welche Realm-Instanz Sie schließen möchten? Was meinen Sie mit "Hintergrundinstanz"? –

+0

@TimCastelijns Ich möchte die Realm-Instanz in 'execute' schließen. Will schnell meine Frage mit einigen weiteren Informationen bearbeiten – Lunchbox

+0

Meinst du die hier übergebene Instanz 'public void execute (Realm Realm) {'? –

Antwort

11

Die Reich-Instanz, die für Sie

@Override 
public void execute(Realm realm) { 

geschlossen ist hier

geben wird. Sie müssen sich keine Gedanken darüber machen, es selbst zu schließen.

Wenn Sie den Quellcode für Realm.executeTransactionAsync() überprüfen, können Sie finden

bgRealm.beginTransaction(); 
try { 
    transaction.execute(bgRealm); 

    if (!Thread.currentThread().isInterrupted()) { 
     bgRealm.commitTransaction(false, new Runnable() { 
      @Override 
      public void run() { 
       // The bgRealm needs to be closed before post event to caller's handler to avoid 
       // concurrency problem. eg.: User wants to delete Realm in the callbacks. 
       // This will close Realm before sending REALM_CHANGED. 
       bgRealm.close(); 
      } 
     }); 
     transactionCommitted = true; 
    } 
} 
... 

Also zuerst nennt es .execute() auf Ihrer Transaktion und nach, dass es geschlossen, um das Reich Instanz es an Sie weitergegeben.

1

Wie Tim Castelijns sagte, executeTransactionAsync bereits Realm schließt, sowieso, schließen nicht Instanz des Bereichs nicht UI Block, sondern löst Ausnahme wenn Sie versuchen, eine Realm Instanz zu öffnen, so sollten Sie ein anderes Problem haben

+0

Ich würde, wenn ich könnte. Siehe die Kommentare, die ich hinzugefügt habe. Ich kann nicht auf die Hintergrund-Realm-Instanz in onSuccess/onError zugreifen. – Lunchbox

+0

Tim Castelijns sagte, dass executeTransactionAsync() Realms bereits schließt, so dass Sie ein anderes Problem haben sollten – MikeOx

2

Dies ist eine Möglichkeit.

  final Realm realm = Realm.getDefaultInstance(); 
      realm.executeTransactionAsync(new Realm.Transaction() { 
       @Override 
       public void execute(Realm realm) { 
        // Execute realm code 
        realm.copyToRealmOrUpdate(myData); 
       } 
      }, new Realm.Transaction.OnSuccess() { 
       @Override 
       public void onSuccess() { 
        Log.i("CB", "success"); 
        realm.close(); 
       } 
      }, new Realm.Transaction.OnError() { 
       @Override 
       public void onError(Throwable error) { 
        Log.i("CB", "error - " + error.getMessage()); 
        realm.close(); 
       } 
      }); 
     } 

Obwohl die Hintergrund Reich Instanz automatisch geschlossen wird