当前位置: 首页 > 知识库问答 >
问题:

你的领域是从一根没有弯针的线打开的

魏鸿
2023-03-14

我以为我遵循了推荐的领域方法来运行异步数据插入,如下所示:

public void addCustomer(final Customer customer) {
        Realm insertRealm = Realm.getDefaultInstance();
        insertRealm.executeTransactionAsync(new Realm.Transaction() {
            @Override
            public void execute(Realm backgroundRealm) {
                long id = customerPrimaryKey.incrementAndGet();
                customer.setId(id);
                backgroundRealm.copyToRealm(customer);
            }
        }, new Realm.Transaction.OnSuccess() {
            @Override
            public void onSuccess() {
                Log.d(LOG_TAG, "Customer Added");
            }
        }, new Realm.Transaction.OnError() {
            @Override
            public void onError(Throwable error) {
                Log.d(LOG_TAG, error.getMessage());
            }
        });

        insertRealm.close();

    }

但是,当我运行上面的代码时,我得到“您的领域是从没有Looper的线程打开的,并且您提供了回调,我们需要一个处理程序来调用您的回调”

我在一个非活动类中运行这段代码,我在这里做错了什么,我该如何修复它。谢了。

事实证明这个查询没有问题,问题是我是从IntentService调用它的。我试图在应用程序首次运行时植入数据库,所以我像这样解决了这个问题:

protected void onHandleIntent(Intent intent) {
        Realm realm = Realm.getDefaultInstance();

        //Add sample Customers to database
        List<Customer> customers = SampleCustomerData.getCustomers();

        realm.beginTransaction();
        for (Customer customer: customers){
            customer.setId(customerPrimaryKey.getAndIncrement());
            realm.copyToRealm(customer);
        }
        realm.commitTransaction();

realm.close();

    }

该修复,在意向服务之外,从 UI 线程调用查询时工作正常。

共有3个答案

丌官嘉良
2023-03-14

您需要从UI线程调用addCustomer。

陈季
2023-03-14

Realm依赖于Hanfler和Looper类的Android线程通信。看起来你从另一个后台线程查询异步操作(为什么?,它已经在后台,使用同步版本)。要解决此问题,您需要使用活动循环器的线程。使用处理程序线程作为后台线程 - 它将初始化Looper

伊温书
2023-03-14

为了为了

insertRealm.executeTransactionAsync(new Realm.Transaction() {
      @Override
        public void execute(Realm backgroundRealm) {
            //...
        }
    }, new Realm.Transaction.OnSuccess() {
        @Override
        public void onSuccess() {
            // !!!
        }
    }, new Realm.Transaction.OnError() {
        @Override
        public void onError(Throwable error) {
            // !!!
        }
    });

要在后台线程上调用的异步事务回调,该线程需要与循环器相关联(因此具有可以与该循环器的线程进行通信的处理程序)。

解决方案,在后台线程上使用同步事务。

但你已经明白了。

protected void onHandleIntent(Intent intent) {
    Realm realm = null;
    try {
        realm = Realm.getDefaultInstance();
        final List<Customer> customers = SampleCustomerData.getCustomers();
        realm.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                for (Customer customer: customers){
                    customer.setId(customerPrimaryKey.getAndIncrement());
                    realm.insert(customer);
                }
            }
        });
    } finally {
        if(realm != null) {
            realm.close();
        }
    }
}
 类似资料:
  • Realm中的以下Swift 3.0对象相当于什么? 常规雨燕 商店类别: 项目类别: 领域 我试过这个,但我得到一个错误: 错误:属性无法标记为动态,因为它的类型无法在Objective-C中表示 物品类别:没有错误

  • Java抛出某种类型的“Java.lang.IllegalAccessError类SomeJavassistProxy(在未命名模块中)无法访问类Java.lang.Reflect.Method(在模块Java.base中),因为模块Java.base不将Java.lang.Reflect导出到未命名模块”。 这是预期的行为。 然后我尝试了bytebuddy库,它生成了以下类:

  • 问题内容: 当我尝试从Realm数据库中获取对象时,该应用程序崩溃了,并且出现以下错误: 这是我的活动 这是模型 有人知道如何解决它?公共类Haltes实现RealmModel { } 问题答案: 我的问题通过在所有其他插件之后声明来解决。 应用级Gradle

  • 问题内容: 当我打电话给 它抛出exepiton:这是错误 这是我的应用程序类 这是我的境界模型 这是我尝试检索模型的地方 gradle配置: 我尝试了所有可以在堆栈上找到的内容: 清理构建,重建项目,启用注释处理器,重新安装apk,使缓存无效/重新启动 问题答案: 问题在gradle文件中。仅使用插件的排序规则的问题,由于@EpicPandaForce的评论,问题已解决,我正在写答案,以帮助其他

  • 我想附加到 WebSphere JVM 并获取有用的数据,如垃圾回收器的名称及其收集计数、线程计数、堆/非堆内存使用情况、JVM 正常运行时间等。但是,此链接提供了 WebSphere JVM 中可用的 MBean 列表 - http://pic.dhe.ibm.com/infocenter/wasinfo/v6r1/index.jsp?topic=/com.ibm.websphere.javad