Сбой предмета удален.Но я делаю запрос Realm первым - PullRequest
0 голосов
/ 16 октября 2018

Я получаю ответ и делаю это:

 if (jsonObject != null && jsonObject.has("results")) {
                try {
                    final JSONArray array = jsonObject.getJSONArray("results");
                    Realm realm = Realm.getInstance(PSApplicationClass.Config);
                    realm.executeTransaction(new Realm.Transaction() {
                        @Override
                        public void execute(Realm realm) {
                            try {
                                realm.delete(Beacon.class);
                                realm.createOrUpdateAllFromJson(Beacon.class, array);
                            } catch (Exception e) {
                                Log.e("", "error is: " + e.getMessage());
                            }
                            if (back != null)
                                back.onResponse("");
                        }
                    });
                    realm.close();
                } catch (Exception e) {
                    Log.e("", "error trying to fetch user beacons: " + e.getMessage());
                    if (back != null)
                        back.onResponse("");
                }
            }

Это в моем классе моделей Beacon.java.Теперь, после этого, в своей Деятельности я делаю это:

 public void setBeaconsInList() {
    Realm realm = Realm.getInstance(PSApplicationClass.Config);
    RealmResults<Beacon> beaconsResults = realm.where(Beacon.class).findAll();
    if (beaconsResults != null && beaconsResults.size() > 0) {
        for (Beacon beacon : beaconsResults) {
             for (Beacon beacon : beaconsResults) {
                if (!beacons.contains(beacon)) {
                    if (beacon.getUser_vehicle() != null) {
                        beacons.add(0, beacon);
                        userBeaconAdapter.addItemFirst(beacon);
                    } else {
                        beacons.add(beacon);
                        userBeaconAdapter.addItem(beacon);
                    }
                }
            }
        }
    }
    userBeaconAdapter.notifyDataSetChanged();
    realm.close();
}

Я получаю эту ошибку:

10-16 17:39:09.527: E/AndroidRuntime(27720): java.lang.IllegalStateException: Object is no longer valid to operate on. Was it deleted by another thread?
10-16 17:39:09.527: E/AndroidRuntime(27720):    at io.realm.internal.UncheckedRow.nativeGetIndex(Native Method)
10-16 17:39:09.527: E/AndroidRuntime(27720):    at io.realm.internal.UncheckedRow.getIndex(UncheckedRow.java:137)
10-16 17:39:09.527: E/AndroidRuntime(27720):    at io.realm.BeaconRealmProxy.equals(BeaconRealmProxy.java:851)
10-16 17:39:09.527: E/AndroidRuntime(27720):    at java.util.ArrayList.contains(ArrayList.java:339)
10-16 17:39:09.527: E/AndroidRuntime(27720):    at nl.hgrams.passenger.activities.PSUserBeaconsActivity.setBeaconsInList(PSUserBeaconsActivity.java:144)
10-16 17:39:09.527: E/AndroidRuntime(27720):    at nl.hgrams.passenger.activities.PSUserBeaconsActivity$2.onResponse(PSUserBeaconsActivity.java:126)
10-16 17:39:09.527: E/AndroidRuntime(27720):    at nl.hgrams.passenger.model.vehicle.Beacon$1.onResponse(Beacon.java:117)
10-16 17:39:09.527: E/AndroidRuntime(27720):    at nl.hgrams.passenger.utils.WSCalls$1.onResponse(WSCalls.java:98)
10-16 17:39:09.527: E/AndroidRuntime(27720):    at nl.hgrams.passenger.utils.WSCalls$1.onResponse(WSCalls.java:77)
10-16 17:39:09.527: E/AndroidRuntime(27720):    at com.android.volley.toolbox.JsonRequest.deliverResponse(JsonRequest.java:90)
10-16 17:39:09.527: E/AndroidRuntime(27720):    at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:102)
10-16 17:39:09.527: E/AndroidRuntime(27720):    at android.os.Handler.handleCallback(Handler.java:739)
10-16 17:39:09.527: E/AndroidRuntime(27720):    at android.os.Handler.dispatchMessage(Handler.java:95)
10-16 17:39:09.527: E/AndroidRuntime(27720):    at android.os.Looper.loop(Looper.java:148)
10-16 17:39:09.527: E/AndroidRuntime(27720):    at android.app.ActivityThread.main(ActivityThread.java:5417)
10-16 17:39:09.527: E/AndroidRuntime(27720):    at java.lang.reflect.Method.invoke(Native Method)
10-16 17:39:09.527: E/AndroidRuntime(27720):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
10-16 17:39:09.527: E/AndroidRuntime(27720):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

Почему это происходит?Если я воссоздаю свой экземпляр области и запрашиваю, почему он возвращает объекты, которые были удалены?Я просто хочу показать оставшиеся объекты.

Если нет, есть ли другой способ проверки и удаления объектов, которые не были обновлены с сервера?

1 Ответ

0 голосов
/ 17 октября 2018

Благодаря комментарию Орландо я понял это.Мой список сравнивался с объектами внутри моего адаптера, и из-за моих изменений объекты из адаптера оказались устаревшими.Вот где моя логика пошла не так.Дело не в том, что новый запрос устарел, но я не очистил адаптер.Делая это, прежде чем исправить это:

  beacons.clear();
  userBeaconAdapter.clearItems();
...