Ошибка Android с областью при попытке использовать асинхронность. Говорит, что он открыт из потока без петлителя

Я получаю следующую ошибку в этом коде: «Ваша область открывается из потока без Looper. Асинхронным запросам нужен обработчик для отправки результатов вашего запроса» в этой строке:

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

Я попытался установить realm.executeTransaction внутри обработчика (Looper.getMain()), но безуспешно. Что я делаю не так?

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());
                        }
                    });
                }
            }
        });

person rosu alin    schedule 29.02.2016    source источник
comment
Не могли бы вы поделиться кодом, где вы звонили findAllAsync?   -  person beeender    schedule 01.03.2016
comment
findAllAsync есть внутри execute, 5-я строка. После Log.i(,testVehicles возможноFetchData 12);   -  person rosu alin    schedule 01.03.2016


Ответы (1)


Проблема в том, что вы используете асинхронные запросы в асинхронной транзакции, что совсем не обязательно.

При вызове realm.executeTransaction(Realm.Transaction, Realm.Transaction.Callback) блок кода в транзакции будет выполняться в рабочем потоке, который не имеет зацикливателя и не нуждается в зацикливании.

Но для асинхронных запросов вам нужен зацикливатель, чтобы убедиться, что результат запроса может быть доставлен обратно на Android.

Итак, чтобы решить вашу проблему, просто используйте вместо этого запрос синхронизации, просто позвольте ему работать в рабочем потоке транзакции. в качестве:

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