【问题标题】:Realm can't execute executeTransaction inside new Thread领域无法在新线程中执行 executeTransaction
【发布时间】:2019-02-17 19:27:34
【问题描述】:

在上面的代码中,realm 不能在新的线程中执行它的事务,没有错误显示,但它也没有执行。

我已经尝试将事务放在线程之外,问题是它消耗了 UI 线程,但它运行良好,我想在 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();
        }
    }
};

【问题讨论】:

  • 我认为这可能会有所帮助,github.com/realm/realm-java/issues/3788
  • 你能添加代码保存的东西吗?我猜你正在创建一个非托管对象并忘记保存它,所以你可以在事务中做你想做的一切,什么都不会被保存;)

标签: android android-asynctask realm retrofit2


【解决方案1】:

您需要致电Realm.close()

你使用没有looper的Java线程这意味着你的Realm在你调用Realm.close()之前不会刷新,所以在finally块中关闭你的Realm。

    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的用户界面 thread 是 Looper。)这意味着 Realm 实例将是 定期更新到最新版本。这可以让你保持你的 UI 几乎毫不费力地不断更新最新内容!

如果你从没有 Looper 的线程中获取 Realm 实例 附加,该实例中的对象在您调用之前不会更新 waitForChange 方法。保留旧版本的数据是 在内存和磁盘空间方面昂贵,并且成本增加 保留的版本和当前版本之间的版本数 最新的。这就是为什么关闭 Realm 实例很重要的原因 一旦你在线程中完成它。

如果您想检查您的 Realm 实例是否具有自动刷新功能 激活与否,使用 isAutoRefresh 方法。 一旦你在线程中完成它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多