Остановите функции и вызовы фрагмента и сбросьте внутренние переменные - PullRequest
0 голосов
/ 23 февраля 2020

В моем приложении у меня есть активность и фрагмент.

Фрагмент работает с параметром "A", который задан действием. У него есть свои массивы, et c. Фрагмент перемещается между различными функциями (от функции к другой), а также вызывает асинхронные функции для получения файлов, чтения из базы данных и т. Д. c.

Ситуация такова, что я хочу, чтобы в конкретный момент, когда я нажимаю кнопку sh в активности mi, отправлял уведомление из моей основной деятельности во фрагмент, чтобы остановить всю обработку и начать с начала процесс с оригинальным параметром "B". То есть перезапустите все переменные во фрагменте, остановите все выполняющиеся в данный момент функции и все асинхронные функции и т. Д. c и начните с параметра B весь процесс во фрагменте.

Мое решение то, что не работает, выглядит следующим образом:

  • У меня есть функция GetRequest (запрос) во фрагменте.

  • Из действия I вызовите эту функцию, исправив запрос параметра == B.

  • В каждой функции фрагмента у меня есть условие в начале этих функций, проверяющее if (request! = null). Затем, если request! = Null, я вызываю функцию во фрагменте, чтобы перезапустить все внутренние переменные, и вызываю первую функцию, et c. В противном случае, я продолжаю работу с кодом в обычном режиме.

Проблема в том, что я думаю, что это не работает с асинхронными функциями, поскольку иногда я получаю ошибки в переменных, которые я сбрасываю на ноль и они пытаются читать и т. д.

Я уверен, что это не лучший способ добиться этого. Не могли бы вы помочь мне?

Спасибо!

1 Ответ

0 голосов
/ 23 февраля 2020

Я предложу вам использовать LiveData с ViewModel в этом случае

Например:

Сначала создайте ViewModel класс

YourViewModel. java:

//initialize this mutableLiveData first
public MutableLiveData<String> parameterA = new MutableLiveData<>("");

private void setParameterA(String myValue){
    parameterA.setValue(myValue);
}

Затем в YourActivity. java, получите ViewModel класс

YourViewModel viewModel;

@Override
protected void onCreate(Bundle savedInstanceState) {

   ... all other thing 

   viewModel = ViewModelProviders.of(this).get(YourViewModel.class);
}


//then whatever the situation in activity,u want to update parameterA
private void SomeSituation() {
    //update the parameterA
    ...
    viewModel.setParameterA("Your value Here")
}

Затем в своем фрагменте обратите внимание на значение параметра A

Ваш фрагмент:

  // in onCreate() or onViewCreated()

@Override
public void onViewCreated(@NonNull final View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState); 

  //get the same viewModel
  viewModel = ViewModelProviders.of(requireActivity()).get(YourViewModel.class);


  viewModel.parameterA.observe(getViewLifecycleOwner(), new Observer<String>() {
        @Override
        public void onChanged(String parameterA) {
            // anything changes on parameterA
            // do whatever you want with the value S
        }
    });
 }

Таким образом, по методу выше, всякий раз, когда есть изменения parameterA в действии фрагмент получит обновление асинхронным, затем вы можете делать все, что захотите, со значением обновления в разделе onChanged().

Как вы упомянули в комментарии:

получите файлы (считывает из базы данных), переменные, массивы

LiveData могут также использоваться для пользовательского класса Model, например, MutableLiveData<List<Post>>, поэтому, когда вы setValue() в activity, ваш фрагмент может получить значение асинхронно в onChanged().

Перед использованием LiveData, вам необходимо Добавить компоненты в ваш проект

Это Android M В архитектуре VVM вы можете увидеть do c здесь , пример здесь

...