Область не находит вставленный объект только после повторного открытия приложения - PullRequest
0 голосов
/ 08 июня 2018

В основном я пытаюсь проверить, существует ли объект, прежде чем пытаться его использовать, если нет, я добавляю его заранее, затем пытаюсь использовать его.

Если он не существует, он будет добавлен правильно, но впоследствии он все равно не будет найден приложением, пока я не открою приложение.

Однако все работает, как предполагалось, если объектначать с

private class ExerciseViewPageAdapter extends FragmentPagerAdapter {

    Realm realm;

    ExerciseViewPageAdapter(FragmentManager fm) {
        super(fm);

    }

    @Override
    public Fragment getItem(int pos) {
        realm = Realm.getDefaultInstance();

        String exercise_name = getIntent().getExtras().getString("exercise_name");

        boolean found_exercise = realm.where(Exercise.class).equalTo("name", exercise_name).findAll().size() > 0;
        if (!found_exercise) {
            CompositeDisposable disposable = new CompositeDisposable();
            ExerciseClient client = new ExerciseClient(getApplicationContext());
            disposable.add(client.getExerciseByName(exercise_name)
                    .subscribeOn(Schedulers.io())
                    .subscribe(
                            this::getExercisesSuccess,
                            this::getExercisesError
                    )
            );


        }

        final ArrayList<Exercise> exercise = new ArrayList<>();
        exercise.add(realm.where(Exercise.class).equalTo("name", exercise_name).findFirst());
        if (exercise.get(0) != null) {
            switch (pos) {
//returning new fragments depending on position
            }
        }
//if exercise.get(0) doesn't exist at first, even tho I added it afterwards it's still null here unless I reopen the app or let it crash
        finish();
        realm.close();
        return null;
    }

    private void getExercisesError(Throwable throwable) {

    }


    private void getExercisesSuccess(Exercise exercise) {
        try (Realm r = Realm.getDefaultInstance()) {
            r.executeTransaction(realm -> {
                realm.insertOrUpdate(exercise);
            });
        }

    }

    @Override
    public int getCount() {
        return 3;
    }
}

Редактировать: TL; DR: проблема в том, что объект виден realm.where()... после вставки объекта перед ним только после повторного открытия приложения

1 Ответ

0 голосов
/ 08 июня 2018

Вы вызвали api, он будет работать в фоновом режиме, поэтому будет выполняться код, следующий за записанным в вызове api.Таким образом, ваша деятельность будет закрыта автоматически.

вызовите проверку вашего успешного API-интерфейса при сбое

private void getExercisesSuccess(Exercise exercise) {
    try (Realm r = Realm.getDefaultInstance()) {
        r.beginTransaction();
        realm.insertOrUpdate(exercise);
        r.commitTransaction();

        //checking records are in realm
        final ArrayList<Exercise> exercise = new ArrayList<>();
        exercise.add(realm.where(Exercise.class).equalTo("name", exercise_name).findFirst());
        if (exercise.get(0) != null) {
            switch (pos) {
                //returning new fragments depending on position
            }
        }
        //if exercise.get(0) doesn't exist at first, even tho I added it    afterwards it's still null here unless I reopen the app or let it crash
        finish();
        realm.close();
    }catch(Exception e){}
}

И удалите нижние строки из вашего getItem ()

  final ArrayList<Exercise> exercise = new ArrayList<>();
    exercise.add(realm.where(Exercise.class).equalTo("name", exercise_name).findFirst());
    if (exercise.get(0) != null) {
        switch (pos) {
            //returning new fragments depending on position
        }
    }
    //if exercise.get(0) doesn't exist at first, even tho I added it afterwards it's still null here unless I reopen the app or let it crash
    finish();
    realm.close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...