android - RXJava 和 DialogFragment => Dialog 等待 observable - 为什么?

标签 android rx-java android-dialogfragment

我显示一个 DialogFragment 并在后台加载数据。我希望对话框显示出来,数据不断加载并逐步更新已经可见的对话框。

问题

在 observable 完成之前不会显示对话框。为什么?

代码

private final static Handler mHandler = new Handler();

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    Observable<List<Data>> observable =  Observable.create(new Observable.OnSubscribe<Data>()
    {
        @Override
        public void call(Subscriber<? super Data> subscriber)
        {

            // iterate and create data
            for (int i = resolveInfo.size() - 1; i >= 0; i--)
            {
                 Data d = ...;
                 subscriber.onNext(d);
            }

            subscriber.onCompleted();
        }
    })
            .onBackpressureBuffer()
            .buffer(150, TimeUnit.MILLISECONDS)
            .filter(new Func1<List<Data>, Boolean>()
            {
                @Override
                public Boolean call(List<Data> rxSingleDatas)
                {
                    return rxSingleDatas.size() > 0; // only deliver not emtpy lists!
                }
            })
            .onBackpressureBuffer()
            .doOnNext(new Action1<List<Data>>()
            {
                @Override
                public void call(List<Data> shareDatas)
                {
                    // add result to list + notify adapter
                    for (int i = 0; i < shareDatas.size(); i++)
                        mData.add(shareData);
                    if (mAdapter != null)
                        mAdapter.notifyDataSetChanged();
                }
            })
            .doOnCompleted(new Action0()
            {
                @Override
                public void call()
                {
                    // flag to indicate all data is loaded
                    mReady = true;
                }
            });

    // subscribe on handler thread for async execution
    // observe on main thread for updating UI
    mSubscription = observable
            .subscribeOn(HandlerScheduler.from(mHandler))
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe();
}

@Override
public void onDestroy()
{
    if (mSubscription != null)
        mSubscription.unsubscribe();
    super.onDestroy();
}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
    MaterialDialog.Builder builder = new MaterialDialog.Builder(getActivity())
            .title(R.string.share_with)
        .cancelable(true)
        .autoDismiss(false);

    mAdapter = ...;
    builder
            .adapter(mAdapter, new MaterialDialog.ListCallback() {
                @Override
                public void onSelection(MaterialDialog materialDialog, View view, int i, CharSequence charSequence) {

                    if (!mReady)
                        return;

                    // handle click
                }
            });

    MaterialDialog dlg = builder.build();
    return dlg;
}

编辑

我将处理程序替换为在后台线程上运行的处理程序,但这会导致以下异常:CalledFromWrongThreadException 尝试在 doOnNext 调用中更新适配器时。 . 我会说 observeOn 应该有在主线程上调用 doOnNext 的效果,但似乎,这不起作用......

最佳答案

对于 subscribeOnobserveOn 运算符的工作方式有些困惑。

subscribeOn() 将线程应用于生成部分(此处为 Observable.create())以及之后的任何内容,直到第一个 observeOn() 或按设计在特定线程上运行的运算符。因此,observeOn 会切换链中其下游操作的线程。除非明确告知,否则 RxJava 不会自动切换线程。

关于android - RXJava 和 DialogFragment => Dialog 等待 observable - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35010099/

相关文章:

android - 推特喜欢 ListView

android - 从android中的文件读取时添加的垃圾

Android onSearchRequested() 回调到调用 Activity

java - RxJava;如何同步发射 observables

java - Android:在适配器上打开对话框

android - 设置 DialogFragment 的大小

android - 从 fragment 调用日期选择器

android - 停止动画并重新开始

java - RxJava 两个请求按顺序

java - 消费观察者同时发出的值