2017-02-23 97 views
-3

我与Rxjava2工作,NetworkOnMainThreadException时可观察subscrible rxjava

我在RxJava使用flatmap下面的结构:

Observable1.flatmap()并返回到可观察2

如下代码:

getApi().createUser(os, deviceToken) 
      .compose(view.regisObserver()) 
      .subscribeOn(Schedulers.io()) 
      .flatMap(result -> { 
       String user_token = result.data.user_token; 
       getPreferenceStore().setAuthToken(user_token); 

       setReadPolicy(); 

       Observable<ObjectDto<UserProfile>> obs = getApi().updateProfile(null, null, null); 
         obs.compose(view.regisObserver()); 

       return obs; 
      }) 
      .subscribe(result-> { 
       getPreferenceStore().setUserId(result.data.user_id); 

      //     view.onUpdateProfile(); 
      }, Throwable::printStackTrace); 

@Override 
public <T> ObservableTransformer<T, T> regisObserver() { 
    return observable -> observable.compose(prepare()) 
      .doOnSubscribe(disposable -> showProgressDialog()) 
      .doOnComplete(this::closeProgressDialog) 
      .doOnError(throwable -> { 
       if (BuildConfig.DEBUG) { 
        throwable.printStackTrace(); 
       } 
       showProgressDialog(); 
       closeProgressDialog(); 
      }); 

} 

该代码编译没有错误。它在运行时出错NetworkErrorOnMainThread。我不知道如何解决它。

+0

您不应在MainThread上运行任何网络调用,请使用单独的线程。 –

+1

Cmon,它已经被回答了很多次... http://stackoverflow.com/questions/34349334/rxjava-and-retrofit2-networkonmainthreadexception http://stackoverflow.com/questions/27687907/android-os-networkonmainthreadexception-使用-rxjava-on-android http://stackoverflow.com/questions/33390532/networkonmainthreadexception-with-retrofit-beta2-and-rxjava http://stackoverflow.com/questions/23447077/android-rxjava-non-blocking – Than

回答

4

您需要指定要订阅的非UI线程...例如

.subscribeOn(Schedulers.io()) 

其实,貌似你是这样做的updateProfile ....只是还需要做到这一点对于createUser

+0

这很有帮助,但尚未解决。 –

+0

在添加之后,您仍然获得了'NetworkErrorOnMainThread'?你可以添加你得到的完整错误+你的更新代码。 –