2015-01-25 1 views
5

Realm 스레딩 및 문제가 발생했습니다.Android Realm을 사용하여 스레드간에 읽고 쓰는 중

이 간단한 예제에서 나는 2 개의 Thread 개체를 가지고 있습니다. 하나는 쓰기 용이고 다른 하나는 읽기 용입니다. 판독기 Thread은 기록 된 객체의 수를 항상 0으로 가져 오지만 기록기 범위 내에서 DB에있는 항목의 size()은 정확합니다. 앱을 다시 시작하면 리더는 삽입 전에 첫 번째로 확인한 수를 얻습니다.

Thread writer = new Thread() { 

    @Override 
    public void run() { 
     while (mRunning) { 
      try { 
       Realm r = Realm.getInstance(context, "test_db"); 
       r.beginTransaction(); 

       TestData data = r.createObject(TestData.class); 

       r.commitTransaction(); 

       Logger.e("WRITER THREAD COUNT: " + 
        r.where(TestData.class).findAll().size()); 

       sleep(LATENCY); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
}; 

writer.setPriority(Thread.MAX_PRIORITY); 
writer.start(); 

Thread reader = new Thread() { 

    @Override 
    public void run() { 
     while (mRunning) { 
      try { 
       Logger.e("READING THREAD COUNT: " + Realm.getInstance(context, 
         "test_db").where(TestData.class).findAll().size()); 

       sleep(LATENCY); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
}; 

reader.setPriority(Thread.MAX_PRIORITY); 
reader.start(); 

이 작업을 수행하기 위해 수행해야 할 작업이 있습니까?

감사합니다.

답변

8

여기에서 영역은 Emanuele입니다.

당신이 묘사하는 것은 예상되는 행동입니다. 독자 스레드는 Looper이 없으므로 독자 스레드에서 알림을받을 방법이 없으며 수동으로 refresh을 실행하지 않으면 업데이트되지 않습니다.

out repo에는 Looper이 포함되거나 포함되지 않은 스레드를 사용하는 몇 가지 예가 있습니다 (단원 테스트는 제외). 현재 모범 사례를 보여줍니다.

+0

기술적으로'.refresh()'는 더 이상 존재하지 않지만 ['waitForChange()/stopWaitForChange()'] (https://gist.github.com)을 사용하여 "루퍼 스레드"자동 업데이트를 에뮬레이트 할 수 있습니다./cmelchior/8786ec511f7e1f47673935a26f568106) – EpicPandaForce

관련 문제