Запись и чтение между потоками с Android Realm

Я выполняю некоторые исследования потоковой обработки Realm и столкнулся с проблемой.

В этом простом примере у меня есть 2 объекта Thread , один для записи и второй для чтения. Читатель Thread получает количество записанных объектов всегда как 0, но внутри области авторских прав 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(); , 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(); 

Нужно ли что-то делать для этого?

Благодарю.

Эмануэле из Королевства здесь.

То, что вы описываете, является ожидаемым поведением 🙂 Поскольку поток читателя не имеет Looper , он не имеет возможности получать уведомления из потока читателей и никогда не будет обновляться, если вы вручную не выполните refresh .

В outpore мы имеем несколько примеров (не говоря уже о модульных тестах) с использованием потоков с Looper и без него, иллюстрирующих текущие лучшие практики.

Intereting Posts
Android, вкладки без панели действий Как запустить файл .apk, созданный с помощью Cordova на устройстве вместо эмулятора? Преобразование файла pcm в mp3 с использованием liblame в android Инструменты: overrideLibrary не работает Как сделать эффект пульсации над линейным макетом, не переопределяя цвет фона для своих детей? API Google Apps для сервисов Google Play / setSmallestDisplacement не работает Как получить идентификатор контакта, адрес электронной почты, номер телефона в одном запросе SQLite? Контакты Оптимизация Android Android получает растровое изображение или звук из активов Использование arraylist для конечного автомата Фрагмент replace () не заменяет все фрагменты Как отправить зависимый поставщик AVRCP от Bluetooth и передать команды из приложения? Эмулятор Nexus 7 использует папку макета, а не layout-sw600dp Как создать пользовательский api для tabhost и tabwidget? Crashlytics Несколько файлов dex определяют ошибку Есть ли способ для push-уведомлений в libGDX (проекты Android и iOS)?