Можно ли вызвать наблюдателя только один раз после завершения всех запросов (вставить / обновить / удалить)? - PullRequest
0 голосов
/ 20 мая 2019

Я новичок в комнате и жилате. Моя задача состоит в том, чтобы получить данные через службу и вставить в базу данных помещения и обновить пользовательский интерфейс с помощью обозревателя liveata, но всякий раз, когда я выполняю эту задачу, наблюдатель вызывает 3 раза из-за изменений в жизненных данных (вставка, обновление или удаление). Но на самом деле мне нужно вызвать наблюдателя только один раз после завершения всех запросов (вставить / обновить / удалить), а затем удалить наблюдателей из основного потока. Пожалуйста, помогите решить

Инициализация наблюдателя от основного фрагмента:

int updateCount=0; // i don't like to use this count
    public void configureViewModel(){
        SCREEN_ID=SCREEN_NO_ADDRESS_DETAIL;
        viewModel = ViewModelProviders.of(this, viewModelFactory).get(DynamicUIViewModel.class);
        viewModel.init(SCREEN_ID,loanType);
        Observer observer=new Observer() {
            @Override
            public void onChanged(@Nullable Object o) {
                List<DynamicUITable> list=(List<DynamicUITable>)o;
                updateCount++;
                if(updateCount==3) {
                    viewModel.getDynamicUITableLiveData().removeObserver(this); // i want to remove observer without checking this updateCount condition.
                    updateCount=0;
                    updateUI(list);
                }
            }
        };
        viewModel.getDynamicUITableLiveData().observe(getViewLifecycleOwner(), observer);
    }

Repository Class :
 public LiveData<List<DynamicUITable>> init(String screenName,String loanType){
                try {
                    refreshData(screenName,loanType);
                }catch (Exception ex){
                    ex.printStackTrace();
                }
                return  dynamicUIDao.load(screenName);
    }



Service call method :
  private void refreshData(final String screenName,String loanType){
        try{
            executor.execute(()->{
                boolean dataExist = (dynamicUIDao.getTableBasedOnScreen(screenName) != null);

                dynamicUIWebservice.getDynamicUIFromServer(screenName).enqueue(new Callback<List<DynamicUITable>>() {
                    @Override
                    public void onResponse(Call<List<DynamicUITable>> call, Response<List<DynamicUITable>> response) {
                        Log.e("TAG", "DATA REFRESHED FROM NETWORK");
                        executor.execute(()-> {
                            List<DynamicUITable> dynamicUITableList = response.body();
                            if (dynamicUITableList != null) {
                                if (dataExist) {
                                    dynamicUIDao.deleteRecords(screenName);
                                    dynamicUIDao.save(dynamicUITableList);
                                } else {
                                    dynamicUIDao.save(dynamicUITableList);
                                    dynamicUIDao.load(screenName);
                                }
                               /* From here observer is calling whenever live data changes but what i need is , i need to 
                                call observer only one time after completion all query operation*/
                            }
                        });
                    }

                    @Override
                    public void onFailure(Call<List<DynamicUITable>> call, Throwable t) {
                    }
                });
            });
        }catch (Exception ex){
            ex.printStackTrace();
        }
    }

1 Ответ

0 голосов
/ 20 мая 2019

Вы можете выполнить все операции с БД в одной Транзакции . Это приведет к тому, что ваши наблюдатели будут уведомлены один раз, поскольку вставка, замена и удаление будут выполнены в одной транзакции.

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