【问题标题】:Android error with realm, trying to use async. Says it's opened from a thread with no looper领域的 Android 错误,尝试使用异步。说它是从没有弯针的线程中打开的
【发布时间】:2016-06-12 18:32:33
【问题描述】:

我在此代码中收到以下错误: “您的领域是从没有 Looper 的线程打开的。异步查询需要一个处理程序来发送您的查询结果”在这一行:

"RealmResults<UserVehicle> completed = realm.where(UserVehicle.class).equalTo("id", userVehicleID).findAllAsync();"

我尝试在 Handler(Looper.getMain()) 中设置 realm.executeTransaction 但没有运气。我做错了什么?

PSVehicleService.getInstance(PSVehicleDetailsActivity.this).fetchVehicleTrips(userVehicle, fiveWeeksBeforeDate, lastTripDate, userID, new JsonCallback() {
            @Override
            public void onResponse(final JSONObject jsonObject, VolleyError error) {
                if(jsonObject != null) {
                    Log.i("","testVehicles maybeFetchData 11");
                    realm.executeTransaction(new Realm.Transaction() {
                        @Override
                        public void execute(Realm realm) {
                            try {
                                ObjectMapper mapper = new ObjectMapper();
                                final List<Trip> trips = mapper.readValue(jsonObject.getJSONArray("trips").toString(), new TypeReference<List<Trip>>() {
                                });
                                Log.i("","testVehicles maybeFetchData 12");
                                RealmResults<UserVehicle> completed = realm.where(UserVehicle.class).equalTo("id", userVehicleID).findAllAsync();
                                UserVehicle userVehicle = null;
                                if(completed.size() > 0){
                                    userVehicle = completed.get(0);
                                }
                                if(userVehicle != null) {
                                    Log.i("", "testVehicles maybeFetchData 13");
                                    userVehicle.getTrips().clear();
                                    Log.i("", "testVehicles maybeFetchData 14");
                                    userVehicle.getTrips().addAll(trips);
                                    Log.i("", "testVehicles maybeFetchData 15");
                                    realm.copyToRealmOrUpdate(userVehicle);
                                    Log.i("", "testVehicles maybeFetchData 16");
                                }else{
                                    Log.i("", "testVehicles maybeFetchData 16 NULLLLLLLL");
                                }
                            } catch (Exception e) {
                                Log.i("", "fetchTripsSinceWeeksInPast fetchVehicleTrips2 error" + e.getMessage());
                                Utils.appendLog("ERROR fetchVehicleTrips is:" + e.getMessage(), true);
                            }
                        }
                    }, new Realm.Transaction.Callback() {
                        @Override
                        public void onSuccess() {
                            Log.i("","testVehicles maybeFetchData 17");
                            setPager();
                            Log.i("","testVehicles maybeFetchData 18");
                        }

                        @Override
                        public void onError(Exception e) {
                            Log.i("","testVehicles maybeFetchData 18 ERROR:" + e.getMessage());
                        }
                    });
                }
            }
        });

【问题讨论】:

  • 你能分享一下你打电话给findAllAsync的代码吗?
  • findAllAsync 在那里,在执行内部,第 5 行。在 " Log.i("","testVehicles maybeFetchData 12");"之后

标签: android database asynchronous realm looper


【解决方案1】:

问题是您在异步事务中使用异步查询——这根本没有必要。

在调用realm.executeTransaction(Realm.Transaction, Realm.Transaction.Callback)时,事务中的代码块会在没有looper且不需要looper的工作线程中运行。

但是对于异步查询,您需要一个循环器来确保查询结果可以在 Android 上返回。

所以,要解决您的问题,只需简单地使用同步查询,让它在事务的工作线程中运行。如:

RealmResults<UserVehicle> completed = realm.where(UserVehicle.class).equalTo("id", userVehicleID).findAll();

【讨论】:

    猜你喜欢
    • 2016-05-07
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多