如何管理一个对话片段与RxJava



我一直在试图确定是否有可能创建一个可观察的DialogFragment。我希望能够:

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

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

虽然ReactiveDialog似乎满足我的前两个标准,但它似乎无法处理配置更改。有两个问题需要考虑:

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

我对RxJava还很陌生,所以我还在努力理解你是如何管理这样的东西的。这似乎应该是可能的,但我觉得它需要一个静态或单例Observable管理器,可能还需要retainedInstance DialogFragments

有人有什么建议或最佳实践吗?

这里有两个问题;一个是你不想在布局过程中丢失Java对象——查看运行时更改文档。

另一个问题是,你想创建一个可观察对象,它具有对话框的动作,当该动作被触发时。为此,请查看RxJava文档,即异步观察者示例。您将需要创建一个Observable.OnSubscribe,并将该Subscriber传递给您的代码,以调用必要的onNext/onError/onCompleted调用。

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

<标题> 1。组件
  • 屏幕(活动/片段)-这将显示对话片段
  • 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;
    }
}

相关内容

  • 没有找到相关文章

最新更新