我尝试过使用Scheduler.newThread()和Scheduler.io(),但是我的代码仍然没有结果
Observable<Response> loginObservable = Observable.create(new ObservableOnSubscribe<Response>() {
@Override
public void subscribe(final ObservableEmitter<Response> emitter) throws Exception {
btSignin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(validateFields()) {
// progressDialog.show();
Configs configs = new Configs(LoginActivity.this);
String versionName = new AppUtils(LoginActivity.this).getVersionName();
credentials.setGrantType(GRANT_TYPE_PASSWORD);
credentials.setUserName(username.getText().toString().trim());
credentials.setPassword(password.getText().toString());
credentials.setAppId(configs.getValue(APP_ID));
credentials.setOs(Build.VERSION_CODES.class.getFields()[Build.VERSION.SDK_INT].getName());
credentials.setBrowser(versionName);
// TODO: 05-Jul-17 get device type programmatically
credentials.setDevice("Tablet");
httpAuth = new HttpAuth.Builder()
.setBaseUrl(configs.getValue(BASE_URL))
.setCredentials(credentials)
.build();
// ** This is network request**
Response response = httpAuth.loginToken("Token", TOKEN_NEW);
emitter.onNext(response);
emitter.onComplete();
}
}
});
}
});我就是这样订阅的
loginObservable
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);获得android.os.NetworkOnMainThreadException在这个Response response = httpAuth.loginToken("Token", TOKEN_NEW);
请帮帮忙。
发布于 2017-07-14 11:43:18
您只将onClickListener设置为Schedulers.newThread()中的按钮,但是在onClick中执行的代码在主线程上运行。这就是例外的原因。
发布于 2017-07-14 12:01:25
当您订阅Observable时,您只是将一个clickListener设置为您的Button。您应该做的是创建这样一个逻辑:
btSignin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
getLoginObservable()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
}
}
Observable<Response> getLoginObservable() {
return new ObservableOnSubscribe<Response>() {
@Override
public void subscribe(final ObservableEmitter<Response> emitter) throws Exception {
// create your request
Response response = httpAuth.loginToken("Token", TOKEN_NEW);
emitter.onNext(response);
emitter.onComplete();
}
}
}我不太喜欢这种方法,因为它让人觉得你正在打破反应范式。因此,另一个选项是直接将流绑定到click事件。您可以手动完成,也可以在一个好的库(来自杰克沃顿) RxBinding上进行中继。有了这个库,您可以创建一个Observable,它发出与单击事件关联的项。然后,您可以将这个Observable与您的“流”连接起来,例如使用flatMap操作符。
RxView.clicks(btSignin) // this creates an Observable另一个好建议是使用Retrofit进行网络请求。通过这种方式,您可以直接获得发出响应的Observable。
https://stackoverflow.com/questions/45102040
复制相似问题