Intereting Posts
Ошибка неопределенной базы данных в Android-телефоне? Как получить доступ к представлениям в ActionLayout в меню Как имитировать разрешения для тестирования на Android? (Android MediaPlayer) Как я могу назвать setAudioStreamType (), если MediaPlayer.create () неявно вызывает prepare ()? Пользовательское ведение журнала для Android-приложения Загрузите изображение с помощью функции Parse Cloud Code Разрешение EACCESS запрещено в Android Как я могу использовать несколько значений для свойств макета Android XML? Обновление Android SharedPreferences не работает Сдвиг повторного просмотра в последний элемент в списке Почему мой JsonObjectRequest не работает? Виджет ListView с несколькими незавершенными намерениями Изменение содержимого файла Android .aar / Преобразование в формат .zip и обратно. Установка нескольких настраиваемых элементов в MultiAutoCompleteTextView: Android Фоновая служба должна отправлять местоположение GPS на сервере

Является ли закрытие и повторное открытие экземпляров 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();