Подтвердить что ты не робот

Обновление фрагмента из Activity с помощью Rxjava Android

У меня простой пример использования:

  • Действие1 создает фрагмент1

  • фрагмент1 после создания уведомляет о действии, что он создан, и обновляет его виды активности.

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

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

Edit

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

4b9b3361

Ответ 1

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

Пример кода для шины событий с 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() или в любом месте, которое вы предпочитаете.

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

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
            }
        }
    });

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

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

Надеюсь, что это поможет.

Ответ 2

Рассматриваются две точки:

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

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

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