Intereting Posts
Текст и изображение ArrayAdapter Максимальное количество прокрутки HorizontalScrollView Как вы записываете видео с анимированным оверлеем в Android? Доступ к видео и фотографиям на Android 1.5 + Проблема с диспетчером аварий в режиме Android 6.0 Doze Adb перестает обнаруживать мой телефон через некоторое время Есть ли способ автоматического обновления приложения на Android? Использование layout_alignBaseline и layout_alignBottom в RelativeLayout вместе Тестирование приложения Android с помощью Android Studio API Twitter не принимает URL-адрес обратного вызова для Android-приложения Запуск простых тестов JUnit на Android Studio (IntelliJ) при использовании конфигурации на основе Gradle Android – Как отслеживать использование полосы пропускания процессом? Анализировать файл дампа памяти HPROF из командной строки Eclipse с плагином Android – Заблокировано при «вычислении требований и зависимостей» Создайте круговой показ для устройств до Lollipop (Android)

Является ли закрытие и повторное открытие экземпляров Realm плохой для производительности?

При использовании SQLite у меня обычно есть один экземпляр SQLiteOpenHelper для каждого приложения, и я никогда его не закрываю, поскольку его база данных постоянно используется многими другими классами и закрытие / повторное открытие будет медленнее и сложнее.

Теперь я играю с Realm, и я планирую обращаться к экземплярам Realm только из объектов доступа к данным. Каждый вызов будет выполнен из рабочего потока.

Я читал примеры, и они обычно называют getInstance / close для Activity или фоновой задачи. Поскольку Realm сохраняет данные в файле, таком как SQLite, полезно ли вызывать getInstance / close для каждой операции? Я имею в виду, что бы вызвать close самом деле закрыть соединение с файлом и, таким образом, сделать следующий вызов getInstance медленнее? Должен ли я кэшировать экземпляр Realm на уровне приложения и вместо этого вводить его в DAO?

Solutions Collecting From Web of "Является ли закрытие и повторное открытие экземпляров Realm плохой для производительности?"

Realm использует проверку локального кэша ссылок с подсчитанным потоком + оптимизированную схему. Это означает, что до тех пор, пока у вас есть хотя бы один экземпляр, открытый в потоке, вызывающем Realm.getInstance() это просто поиск HashMap.

Если у вас есть один экземпляр, открытый в любом потоке, мы пропускаем проверку схемы на других потоках, даже если это первый экземпляр, открытый там.

Если вы закроете все экземпляры в данном потоке, мы освободим локальную память потока, и ее необходимо будет перераспределить для следующего экземпляра в этом потоке.

Если вы закрываете все экземпляры во всех потоках, у вас будет «холодная загрузка», которая является самой дорогой, так как нам необходимо выделить память + выполнить проверку схемы.

Лучшей практикой является сохранение экземпляра Realm открытым до тех пор, пока ваш поток живет. Для потока пользовательского интерфейса, который проще всего сделать с использованием шаблона, описанного здесь: https://realm.io/docs/java/latest/#controlling-the-lifecycle-of-realm-instances

Для рабочих потоков, открывающих экземпляр Realm в начале и закрытие, когда выход будет наиболее оптимальным:

 new Thread(new Runnable() { public void run() { Realm realm = Realm.getDefaultInstance(); doWork(realm); realm.close(); } }).start();