RXJava 和 DialogFragment => Dialog 等待 observable - 为什么?
RXJava and DialogFragment => Dialog waits for observable - why?
我显示一个 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
的效果,但似乎这不起作用...
对 subscribeOn
和 observeOn
运算符的工作方式有些困惑。
subscribeOn()
将线程应用于生成部分(此处为 Observable.create()
)以及它之后的任何内容,直到第一个 observeOn()
或按设计在特定线程上运行的运算符。因此,observeOn
切换链中其下游操作的线程。除非明确告知,否则 RxJava 不会自动切换线程。
我显示一个 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
的效果,但似乎这不起作用...
对 subscribeOn
和 observeOn
运算符的工作方式有些困惑。
subscribeOn()
将线程应用于生成部分(此处为 Observable.create()
)以及它之后的任何内容,直到第一个 observeOn()
或按设计在特定线程上运行的运算符。因此,observeOn
切换链中其下游操作的线程。除非明确告知,否则 RxJava 不会自动切换线程。