如何使用RxJava管理DialogFragment?1. 组件

我一直在尝试确定是否有可能创建一个可观察的。从本质上讲,我希望能够:DialogFragment

  • 创建并显示DialogFragment
  • 取回一个可以订阅结果的rx(确定/取消按下,字符串输入,后台任务成功/失败等)Observable
  • 正确处理配置更改

到目前为止,我发现的最接近的东西是ReactiveDialog,它曾经是RxAndroid的一部分,但作为简化RxAndroid的一部分,它已经在v1.0.0中从RxAndroid中删除。

虽然看起来确实符合我的前两个标准,但它似乎没有处理配置更改。有两个问题需要考虑:ReactiveDialog

  1. 必须维护其跨配置更改,以便它可以通知订阅者其状态。DialogFragmentObservable
  2. 订阅者必须能够保留其订阅或在配置更改后重新订阅(显然不会产生内存泄漏)。

我对RxJava还很陌生,所以我仍然试图弄清楚你会如何管理这样的东西。这似乎应该是可能的,但我觉得这需要一个静态或单例管理器,并且可能.ObservableretainedInstanceDialogFragments

有人对此有任何建议或最佳实践吗?


答案 1

这里有两个问题;一个是你不想在中继期间丢失Java对象 - 查看有关该内容的运行时更改文档

另一个问题是,您希望创建一个具有对话框操作的可观察量,当该操作被触发时。为此,请查看 RxJava 文档,即异步观察器示例。您需要创建一个 ,并将其传递给将调用必要 // 调用的代码。Observable.OnSubscribeSubscriberonNextonErroronCompleted


答案 2

我会在对话框中使用ViewModel,这有助于配置更改。配置更改后,重新订阅对话框的 ViewModel。

1. 组件

  • 屏幕(活动/片段) - 这将显示对话框片段
  • 对话框碎片 - 对话框。将发布有关用户操作的更新。
  • 对话框视图模型 - 保存用户的操作流

2. 实施

简单活动

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

简单对话框视图模型

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

推荐