13

У меня есть простой случай, когда использование:фрагмент Обновление от активности с помощью Rxjava Android

  • Activity1 создать fragment1

  • fragment1 после создания уведомляют деятельности, что она создана и обновить свои взгляды activity1.

  • деятельность1 после получения уведомления об обновлении фрагмент1 просмотров.

Я использую rxandroid, подбиблиотеку rxlifecycle компоненты и андроид, но я все еще в процессе обучения фазы, не была даже rx-lifecycle метки на StackOverflow, так что я до сих пор пытаюсь понять поток этой библиотеки ..

Редактировать

Я предпочитаю не использовать EventBus, это так же, как все кричат ​​на всех, чтобы сделать что-то, так Rxjava Наблюдаемый подход будет много полезной

+0

Почему вы хотите, чтобы операция вызывала функцию фрагмента? Что именно вы делаете? –

+0

его просто используемый случай, когда я в основном выполняю сетевой вызов в действии, и когда я закончил, я рисую полилинию в фрагменте карты, который является отдельным фрагментом, замененным в рамках frameelayout активности, но проблема - это жизненный цикл, я не знаю, когда будет фрагмент get created, поэтому я не получаю нулевой контекст во фрагменте –

+0

Вы можете использовать onAttach для получения ссылки на Контекст/Активность и вызывать любой метод, или вы можете полностью выполнить сетевой запрос во Фрагменте. Я не уверен в том, что Rx-материал, хотя –

ответ

3

Для публикации информации от фрагмента к действию вы должны использовать шину событий для информирования о создании фрагмента (замена на обратные вызовы и созданный беспорядок).

Пример код для шины событий с RxJava является:

public class SampleEventsBus { 
    private static final String TAG = SampleEventsBus.class.getSimpleName(); 
    private static final String TAG2 = SampleEventsBus.class.getCanonicalName(); 

    public static final int ACTION_FRAGMENT_CREATED = 1; 
    public static final int ACTION_FRAGMENT_OTHER = 2; 

    private static SampleEventsBus mInstance; 

    public static SampleEventsBus getInstance() { 
     if (mInstance == null) { 
      mInstance = new SampleEventsBus(); 
     } 
     return mInstance; 
    } 

    private SampleEventBus() {} 

    private PublishSubject<Integer> fragmentEventSubject = PublishSubject.create(); 

    public Observable<Integer> getFragmentEventObservable() { 
     return fragmentEventSubject; 
    } 

    public void postFragmentAction(Integer actionId) { 
     fragmentEventSubject.onNext(actionId); 
    } 
} 

Тогда из вашего фрагмента вы можете позвонить:

SampleEventsBus.getInstance().postFragmentAction(SampleEventsBus.ACTION_FRAGMENT_CREATED); 

из onAttach() или onViewCreated() или любого места вы предпочитаете.

Кроме того, в деятельности вам нужно будет поместить следующий код listet для вашего автобуса события:

SampleEventsBus .getInstance().getFragmentEventObservable().subscribe(new Subscriber<Integer>() { 
     @Override 
     public void onCompleted() { 

     } 

     @Override 
     public void onError(Throwable e) { 

     } 

     @Override 
     public void onNext(Integer actionId) { 
      if(actionId == SampleEventsBus.ACTION_FRAGMENT_CREATED) { 
       //do any required action 
      } 
     } 
    }); 

Для второй части, т.е.обновить фрагмент из деятельности, я не рекомендую использовать этот метод, так как это приведет к ненужной сложности, Вместо этого используйте «оригинальный способ», как:

  1. Создать метод в качестве фрагмента updateView(Object obj)
  2. В onNext() , получить желаемый фрагмент, как SampleFragment fragment = (SampleFragment)getSupportFragmentManager().findFragmentByTag("TAG");
  3. вызова fragment.updateView(obj);

Надежда это помогает.

4

Две точки рассмотреть следующие вопросы:

  1. Просто потому, что вы используете EventBus не означает, что она должна быть глобальным. Вы можете иметь несколько автобусов событий, если хотите, и можете просто поделиться одним из двух компонентов (Activity and Fragment).

  2. Есть несколько примеров в документации RxJava, которые показывают , как реализовать функциональность событий шины с помощью RxJava

с помощью шины событий, вы можете упростить вещи значительно, по отмежевывается весь процесс от Жизненный цикл Android.

+0

1 вещь, которую я действительно ненавижу в EventBus, заключается в том, что она прослушивает один тип объекта, так что, если мне нужно общаться на каком-то конкретном событии, скажите, что щелчок по активности может привести к обновлению представления в фрагменте , и это в основном дает строку фрагменту и от активности наоборот, что может означать только то, что я должен создать 2 отдельных класса, просто чтобы сделать это общение возможным с помощью eventbus !!! –

+1

или вы можете получить BaseEvent, содержащий тип события, а затем использовать шаблон дизайна Command, - сохранить обработчики этого события на карте, принять правильное и обработать это событие. Я должен сделать это один раз, пока код рефакторинга –

Смежные вопросы