2016-05-28 4 views
1

Я пытаюсь сделать асинхронный запись с Realm, и мне нужно передать значения настаиваться методу executeTransaction так:Невозможно ExecuteTransactionAsync Android Realm

public void updateAsync(final long id, final String title, final String content, final int color) { 

    mRealm.executeTransactionAsync(new Realm.Transaction() { 
     @Override 
     public void execute(Realm realm) { 
      Note note = getNoteById(id); 
      if (note != null){ 
       note.setTitle(title); 
       note.setContent(content); 
       note.setColor(color);      
       realm.copyToRealmOrUpdate(note); 
      } 

     } 
    }, new Realm.Transaction.OnSuccess() { 
     @Override 
     public void onSuccess() { 
      Log.d(LOG_TAG, "Note Updated"); 
     } 
    }, new Realm.Transaction.OnError() { 
     @Override 
     public void onError(Throwable error) { 
      Log.d(LOG_TAG, error.getMessage()); 
     } 
    }); 


} 

Приведенный выше код блока потерпела неудачу с ошибкой : Доступ к Realm из неправильной нити. Объекты Realm могут быть доступны только в потоке, который был создан.

SO мой вопрос в том, как передать параметры в фоновый поток в Realm?

ответ

0

При вызове executeTransactionAsync, то execute блока будет работать в фоновом потоке, любой Realm объекты доступа из этой потребности нити, которая будет создано/запрошен на этот поток из экземпляра Realm, который является парами из execute.

Вы можете использовать параметр realm для выполнения запросов. Просто измените свой getNoteById(id), чтобы взять экземпляр Realm в качестве параметра, например getNoteById(Realm realm, int id), и используйте команду realm для выполнения запроса.

+0

Есть ли необходимость закрыть экземпляр области в onSuccess и onError ?? –

+0

Зависит от вашего прецедента. Царство, переданное в обратном вызове блока транзакций, не должно быть закрыто, так как оно не создано вами. Царство позаботится или оно. Но созданный вами экземпляр перед вызовом 'executeTransactionAsync' должен быть закрыт. Нет необходимости закрывать его в 'onSuccess' /' onError', вы можете создать его сразу после вызова 'executeTransactionAsync'. Или просто следуйте нормальному шаблону, используйте «onCreate' /' onDestroy' для активности 'getInstance' /' close'. – beeender