2016-08-04 2 views
2

내 응용 프로그램에서 전화에 저장된 연락처를 읽는 데 오랜 시간이 걸릴 수 있습니다. 그런 다음 Realm을 사용하고있는 중첩 된 Thread에 넣었습니다.이 오류는안드로이드 어떻게 스레드에서 렐름을 사용할 수 있습니까

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

그리고 내 솔루션 등이 문제가 해결되지 않는 :

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

또는

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

중첩 된 스레드에

답변

3

Realm 인스턴스를 사용하려는 스레드에서 인스턴스가 필요합니다.

new Handler().post(new Runnable() { 
    @Override 
    public void run() { 
     Realm realm = null; 
     try { 
      realm = Realm.getDefaultInstance(); 
      realm.executeTransaction(new Realm.Transaction() { 
       @Override 
       public void execute(Realm realm) { 
       } 
      }); 
     } finally { 
      if(realm != null) { 
       realm.close(); 
      } 
     } 
    } 
}); 

UI 스레드에서 동기 쓰기를해서는 안됩니다. UI 스레드에서 작성하는 경우 비동기 트랜잭션을 대신 사용하십시오.

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

내 게시물에 대한 귀하의 답변은 매우 유용하며 최근 승인 된 포스트 선생님보다 낫습니다. 매우 고마워요. –

+0

이 답변에서 스레드 점프를하는 이유는 무엇입니까? 이상 하네. – EpicPandaForce

1

다른 스레드에서 영역을 사용하고있는 것이 아니라 다른 스레드에서 instance을 사용하고있는 것이 문제입니다. 일반적으로 쉽게 해결할 수 있습니다.

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

수정. 스레드는 자체 Realm 인스턴스가 필요합니다. 하지만 끝나면 인스턴스를 닫는 것을 잊지 마세요 !! –

관련 문제