Rxで非同期処理とプログレス表示切り替えを分離する
雑記事です。
- 画面遷移時に画面にプログレスを表示して、データ取得待ちを表示したい
-
SwipeRefreshLayout
で画面をリフレッシュできるようにしたい
この2つを満たしつつ、2種類のプログレスの表示制御をするのがめんどくさくねというところから始まりました。
1は画面にプログレスを出したい、2はSwipeRefreshLayout
のプログレスを利用したいという感じです。
非同期処理自体は全く同じですが、トリガーが違うみたいな状態。
public class FooFragment extends Fragment {
FragmentFooBinding dataBinding;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
dataBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_foo, container, false);
// adapterとかの初期化
dataBinding.swipeRefreshLayout.setOnRefreshListener(() -> {
refresh().subscribe(dataBinding.swipeRefreshLayout::setRefreshing);
});
return dataBinding.getRoot();
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
refresh().subscribe(loading -> {
dataBinding.progress.setVisibility(loading ? View.VISIBLE : View.GONE);
});
}
private Subject<Boolean> refresh() {
Subject<Boolean> loadingSubject = BehaviorSubject.create();
mApiService.topics()
.compose(bindUntilEvent(FragmentEvent.DESTROY_VIEW))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnSubscribe(disposable -> loadingSubject.onNext(true))
.doFinally(() -> loadingSubject.onNext(false))
.subscribe(
response -> {
adapter.setData(response.topics);
},
throwable -> Log.e(TAG, "fetch: ", throwable)
);
return loadingSubject;
}
}
Observable
の進捗を通知してやってSubject
で返せば、処理を共通化しつつ、呼び出す側でプログレスを制御できるんじゃないかなっていうアプローチです。
Author And Source
この問題について(Rxで非同期処理とプログレス表示切り替えを分離する), 我々は、より多くの情報をここで見つけました https://qiita.com/ushi3_jp/items/64cbd7dbbb8239bf2eb5著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .