Realm не может выполнить executeTransaction внутри нового потока - PullRequest
0 голосов
/ 17 февраля 2019

В приведенном выше коде realm не может выполнить свою транзакцию в новом потоке, ошибки не отображаются, но она также не выполняется.

Я уже пытался поместить транзакцию вне потока,проблема в том, что он потребляет поток пользовательского интерфейса, но он отлично работает, и я хочу показать плавную загрузку пользователю, пока Retrofit и Realm делают свою работу

threadNova = new Thread() {
    @Override
    public void run() {
        super.run();

        try {
            Response<Retorno> response = getCall.execute();
            final Retorno responsebody = response.body();
            Realm realm = Realm.getDefaultInstance();

            realm.executeTransaction(realm1 -> {
               //Save things on bank
              // No errors but don't enter here either
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
};

1 Ответ

0 голосов
/ 18 февраля 2019

Вам нужно позвонить Realm.close().

Если вы используете Java Thread без зацикливания, это означает, что ваше Царство не обновляется до тех пор, пока вы не вызовете Realm.close(), поэтому закройте свое Царство внутри блока finally.

    try(Realm realm = Realm.getDefaultInstance()) {
            Response<Retorno> response = getCall.execute();
            final Retorno responsebody = response.body();

            realm.executeTransaction(realm1 -> {
               //Save
            });

        } catch (IOException e) {
            e.printStackTrace();
        } 
    }

Из документов:

Если вы получаете экземпляр Realm из потока, связанного с Looper, экземпляр Realm поставляется с функцией автообновления.(Поток пользовательского интерфейса Android - Looper.) Это означает, что экземпляр Realm будет периодически обновляться до последней версии.Это позволяет вам постоянно обновлять ваш пользовательский интерфейс с последним содержимым практически без усилий!

Если вы получаете экземпляр Realm из потока, к которому не прикреплен Looper, объекты из этого экземпляра не будут обновляться доВы вызываете метод waitForChange.Сохранение старой версии ваших данных обходится дорого с точки зрения памяти и дискового пространства, а стоимость увеличивается с количеством версий между сохраняемой и самой последней.Вот почему важно закрыть экземпляр Realm, как только вы закончите с ним в потоке.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...