Intereting Posts
Отслеживание мобильных объявлений Facebook с помощью Google Analytics Панель инструментов AppCompat: изменение цвета значка переполнения в ActionMode Как добавить прокрутку для пользовательского представления в Android Панель навигации Android на стороне, редактируя AOSP Библиотека корневых инструментов Stericson не работает – делает силу близкой? Ошибка открытия ExifInterface JHEAD (андроида) Как отключить отображение пейзажа / портрета в мобильном веб-приложении (Android Browser / iOS-Mobile Safari) Прозрачный тост JSONArray не работает, когда я получаю строку JSON с сервера Стиль меню ShareActionProvider InDict Усталость в android N Ошибка InMobi при выключении тестового режима Как сделать достойный пользовательский интерфейс Отключенная блокировка блокировки клавиатуры повторно активирует себя после нажатия на уведомление Android программно обновляет приложение, когда доступна новая версия

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

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

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

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

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();