2016-01-26 64 views
1

我在后台显示DialogFragment并加载数据。我希望显示对话框,数据不断加载并逐步更新已经显示的对话框。RXJava和DialogFragment =>对话框等待可观察 - 为什么?

问题

该对话框可观察完成之前未示出。为什么?

代码

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

编辑

我换成与同时在后台线程上运行一个处理程序,但是这会导致以下execption:试图更新的适配器时CalledFromWrongThreadExceptiondoOnNext调用...我会说observeOn应该具有在主线程上调用doOnNext的效果,但看起来,这不起作用...

+0

'mHandler'指向后台线程? – AndroidEx

+0

我添加了“mHandler”的定义......并且不是,所以这就是行为的原因......让它在后台线程上运行会导致一个'CalledFromWrongThreadException'虽然虽然我在主线程中观察... – prom85

+0

在你的情况'subscribeOn()'线程适用于'Observable.create()'中的所有内容。 'observeOn()'适用于'observeOn()'之后的所有内容,这里什么都没有,你可以删除这一行。 – AndroidEx

回答

1

有关subscribeOnobserveOn运营商的工作方式有点混淆。

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

+0

感谢您的澄清 – prom85

相关问题