如何使用RxJava管理DialogFragment?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用RxJava管理DialogFragment?相关的知识,希望对你有一定的参考价值。
我一直试图确定是否有可能创建一个可观察的DialogFragment
。基本上我希望能够:
- 创建并显示
DialogFragment
- 获取一个rx
Observable
,可以订阅结果(按下确定/取消,字符串输入,后台任务成功/失败等) - 正确处理配置更改
到目前为止,我发现最接近的是ReactiveDialog
,曾经是Rxandroid的一部分,但是removed from RxAndroid in v1.0.0是简化RxAndroid的一部分。
虽然ReactiveDialog
似乎符合我的前两个标准,但似乎没有处理配置更改。有两个问题需要考虑:
DialogFragment
必须在配置更改时保持其Observable
,以便它可以通知订户其状态。- 订户必须能够在配置更改后保持订阅或重新订阅(显然不会产生内存泄漏)。
我仍然是RxJava的新手,所以我仍然试图围绕你如何管理这样的事情。看起来它应该是可能的,但我觉得它需要一个静态或单身Observable
经理和可能retainedInstance
DialogFragments
。
任何人对此有任何建议或最佳做法?
这里有两个问题;一个是你不想在重新布局期间丢失Java对象 - 请查看runtime changes docs。
另一个问题是,当触发该操作时,您希望创建具有对话操作的Observable。为此,看看RxJava文档,Asynchronous Observer example。您将需要创建一个Observable.OnSubscribe
,并将该Subscriber
传递给您的代码,该代码将调用必要的onNext
/ onError
/ onCompleted
调用。
我会使用ViewModel进行对话,这有助于配置更改。配置更改后重新订阅对话框的ViewModel。
1. Components
- 屏幕(活动/片段) - 这将显示对话框片段
- DialogFragment - 对话框。将发布有关用户操作的更新。
- DialogViewModel - 保存用户的操作流
2.实施
SimpleActivity
public class SimpleActivity extends AppCompatActivity {
private SimpleDialogViewModel dialogViewModel;
private CompositeDisposable compositeDisposable;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
dialogViewModel = ViewModelProviders.of(this).get(SimpleDialogViewModel.class);
compositeDisposable = new CompositeDisposable();
showDialog();
}
@Override
protected void onResume() {
super.onResume();
Disposable disposable =
dialogViewModel
.actionStream()
.subscribe(
result -> {
if (AlertDialog.BUTTON_POSITIVE == result) {
// User clicked yes
}
if (AlertDialog.BUTTON_NEGATIVE == result) {
// User clicked no
}
}
);
compositeDisposable.add(disposable);
}
@Override
protected void onPause() {
super.onPause();
compositeDisposable.clear();
}
private void showDialog() {
SimpleDialogFragment dialogFragment = new SimpleDialogFragment();
dialogFragment.show(getSupportFragmentManager(), SimpleDialogFragment.TAG);
}
}
SimpleDialogFragment
public class SimpleDialogFragment extends DialogFragment {
public static final String TAG = "SimpleDialogFragment";
private SimpleDialogViewModel dialogViewModel;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
dialogViewModel = ViewModelProviders.of(getActivity()).get(SimpleDialogViewModel.class);
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.dialog_simple_message, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
final View btnYes = view.findViewById(R.id.yes);
final View btnNo = view.findViewById(R.id.no);
btnYes.setOnClickListener(v -> dialogViewModel.onClickYes());
btnNo.setOnClickListener(v -> dialogViewModel.onClickNo());
}
}
SimpleDialogViewModel
public class SimpleDialogViewModel extends ViewModel {
private Subject<Integer> actionSubject;
SimpleDialogViewModel() {
actionSubject = PublishSubject.create();
}
public void onClickYes() {
actionSubject.onNext(AlertDialog.BUTTON_POSITIVE);
}
public void onClickNo() {
actionSubject.onNext(AlertDialog.BUTTON_NEGATIVE);
}
public Observable<Integer> actionStream() {
return actionSubject;
}
}
以上是关于如何使用RxJava管理DialogFragment?的主要内容,如果未能解决你的问题,请参考以下文章
如何根据多个 RxJava Completable 结果的结果执行操作