领域无法在新线程内执行executeTransaction

时间:2019-02-17 19:27:34

标签: android android-asynctask realm retrofit2

在上面的代码中,领域无法在新线程内执行其事务,不会显示任何错误,但也不会执行。

我已经尝试将事务放在线程之外,问题是它占用了UI线程,但是它工作得很好,并且我想在Retrofit和Realm进行工作时向用户显示平稳的负载< / p>

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 :(得分:0)

您需要致电Realm.close()

您使用不带循环程序的Java线程,这意味着直到调用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();
        } 
    }

来自文档:

  

如果您从与Looper关联的线程获取Realm实例,   Realm实例具有自动刷新功能。 (Android的用户界面   线程是一个Looper。)这意味着Realm实例将是   定期更新为最新版本。这可以让您保持用户界面   毫不费力地不断更新最新内容!

     

如果从没有Looper的线程获取Realm实例   附加后,该实例中的对象将不会更新,直到您致电   waitForChange方法。保留旧版本的数据是   在内存和磁盘空间方面昂贵,并且成本增加   保留的版本与   最新。这就是为什么关闭Realm实例很重要的原因   在线程中完成操作后,立即执行。

     

如果要检查您的Realm实例是否具有自动刷新   是否激活,请使用isAutoRefresh方法。   在线程中完成操作后,立即执行。