代码之家  ›  专栏  ›  技术社区  ›  Andrei

域仅在重新打开应用程序后才创建插入的对象

  •  1
  • Andrei  · 技术社区  · 7 年前

    基本上,我试着在尝试使用一个对象之前检查它是否存在,如果不存在,我先添加它,然后再尝试使用它。

    如果它不存在,它将被正确添加,但应用程序在以后仍然找不到它,除非我重新打开应用程序

    但是,如果对象是以

    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 回复  |  直到 7 年前
        1
  •  2
  •   Rajasekaran M    7 年前

    您调用了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();
    
    推荐文章