Realm - java.lang.IllegalStateException: объект больше не действителен для работы - PullRequest
0 голосов
/ 29 мая 2018

Я продолжаю получать этот сбой на Fabric, который затрагивает некоторых наших пользователей, но его было очень трудно воспроизвести.Кажется, что это происходит случайно, и в большинстве случаев работает нормально.U

Fatal Exception: java.lang.IllegalStateException: Object is no longer valid to operate on. Was it deleted by another thread?
   at io.realm.internal.UncheckedRow.nativeGetString(UncheckedRow.java)
   at io.realm.internal.UncheckedRow.getString(UncheckedRow.java:157)
   at io.realm.com_pitchero_ph_features_schedule_model_training_SessionRealmProxy.realmGet$venue(com_pitchero_ph_features_schedule_model_training_SessionRealmProxy.java:275)
   at com.pitchero.ph.databinding.RowScheduleTrainingBinding.executeBindings(RowScheduleTrainingBinding.java:125)
   at android.databinding.ViewDataBinding.executeBindingsInternal(ViewDataBinding.java:437)
   at android.databinding.ViewDataBinding.executePendingBindings(ViewDataBinding.java:409)
   at android.databinding.ViewDataBinding$7.run(ViewDataBinding.java:194)
   at android.databinding.ViewDataBinding$8.doFrame(ViewDataBinding.java:286)
   at android.view.Choreographer$CallbackRecord.run(Choreographer.java:957)
   at android.view.Choreographer.doCallbacks(Choreographer.java:734)
   at android.view.Choreographer.doFrame(Choreographer.java:667)
   at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:945)
   at android.os.Handler.handleCallback(Handler.java:751)
   at android.os.Handler.dispatchMessage(Handler.java:95)
   at android.os.Looper.loop(Looper.java:154)
   at android.app.ActivityThread.main(ActivityThread.java:6776)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1518)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408)

Объекты сохраняются в Realm следующим образом:

 public static void saveRealmObjects(final RealmList<RealmObject> objects,
                                    Realm.Transaction.OnSuccess onSuccess,
                                    Realm.Transaction.OnError error) {
    Realm realm = null;
    try {
        realm = Realm.getDefaultInstance();
        realm.executeTransactionAsync(new Realm.Transaction() {
            @Override
            public void execute(Realm bgRealm) {
                bgRealm.copyToRealmOrUpdate(objects);
            }
        }, onSuccess, error);
    } catch (Exception e) {
        Log.e(LOG_TAG, "saveRealmObjects error: " + e.getMessage());
    } finally {
        if (realm != null) {
            realm.close();
        }
    }
}

, и есть запрос, к которому прикреплен прослушиватель для получения обновлений и обновления пользовательского интерфейса соответственно:

 dbQueryFixtures = query
            .equalTo(Fixture.FIELD_CLUB_ID, String.valueOf(club.clubId))
            .equalTo(Fixture.FIELD_MEMBER_ID, getMemberId())
            .findAllAsync();
    dbQueryFixtures.addChangeListener(new RealmChangeListener<RealmResults<Fixture>>() {
        @Override
        public void onChange(RealmResults<Fixture> fixtures) {
            fixtures.sort(Fixture.FIELD_DATE, Sort.ASCENDING);
            final RealmList<Fixture> results = new RealmList<>();
            results.addAll(dbQueryFixtures);
            getEventsHistoryFromDB(results, logic);
        }
    });

После получения обновления результаты передаются в RecyclerView, который обновляет представления.Каждое представление использует DataBinding для получения значений из объекта.Например ::1010*

<data>

    <variable
        name="session"
        type="Session"/>

    <import type="android.text.TextUtils"/>

    <import type="android.view.View"/>
</data>

и

<TextView
                android:id="@+id/schedule_training_subtitle"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical"
                android:includeFontPadding="false"
                android:layout_marginTop="5dp"
                android:text="@{session.venue}"
                android:textColor="@color/grayLight"
                android:textSize="13sp"
                tools:text="Training session"/>

Если бы кто-то мог направить меня в правильном направлении, это было бы очень ценно, так как я не смог добраться до сути.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...