2016-08-04 5 views
2

In meiner Anwendung lese ich Kontakte, die am Telefon gespeichert, kann dies eine lange Zeit dauern, dann legte ich das auf Thread verschachtelt, dass ich Realm verwende, aber ich bekomme diesen Fehler:Android Wie kann ich Realm auf Thread verwenden

Realm access from incorrect thread. 
Realm objects can only be accessed on the thread they were created. 

Und meine Lösungen nicht beheben dieses Problem wie:

new Handler().post(new Runnable() { 
    @Override 
    public void run() { 
     realm.executeTransaction(new Realm.Transaction() { 
      @Override 
      public void execute(Realm realm) { 
      } 
     }); 
    } 
}); 

ODER

new Handler(getMainLooper()).post(new Runnable() { 
    @Override 
    public void run() { 
     realm.executeTransaction(new Realm.Transaction() { 
      @Override 
      public void execute(Realm realm) { 
      } 
     });    
    } 
}); 

auf verschachteltem Thread,

Antwort

3

Sie müssen eine Instanz auf dem angegebenen Thread, in dem Sie versuchen, die Realm-Instanz zu verwenden.

Obwohl Sie keine synchronen Schreibvorgänge auf dem UI-Thread tun sollten. Verwenden Sie stattdessen eine asynchrone Transaktion, wenn Sie auf dem UI-Thread schreiben.

new Handler().post(new Runnable() { 
    @Override 
    public void run() { 
      final Realm realm = Realm.getDefaultInstance(); 
      realm.executeTransactionAsync(new Realm.Transaction() { 
       @Override 
       public void execute(Realm realm) { 
       } 
      }, 
      new Realm.Transaction.OnSuccess() { 
       @Override 
       public void onSuccess() { 
        realm.close(); 
       } 
      }, 
      new Realm.Transaction.OnError() { 
       @Override 
       public void onError(Throwable e) { 
        realm.close(); 
       } 
      }); 
    } 
}); 
+0

Ihre Antwort auf meine Post ist sehr nützlich und besser als die neuesten angenommenen Postsir, Vielen Dank –

+0

Warum mache ich einen Thread Sprung in dieser Antwort? Das ist komisch. – EpicPandaForce

1

Das Problem ist nicht, dass Sie Realm in einem anderen Thread verwenden, das Problem besteht darin, dass Sie die instance auf der realen in einem anderen Thread verwenden. In der Regel, das ist eine einfache Lösung, so etwas tun soll:

Realm realmForThisThread = Realm.getDefaultInstance(); 
realmForThisThread.executeTransaction(new Realm.Transaction() { 
    @Override 
    public void execute(Realm realm) { 
    } 
} 
... 
realmForThisThread.close(); 
+0

Korrekt. Ein Thread benötigt eine eigene Realm-Instanz. Aber vergiss nicht, die Instanz zu schließen, wenn du fertig bist !! –