首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NetworkOnMainThread与Scheduler.io()

NetworkOnMainThread与Scheduler.io()
EN

Stack Overflow用户
提问于 2017-07-14 11:37:48
回答 2查看 132关注 0票数 1

我尝试过使用Scheduler.newThread()和Scheduler.io(),但是我的代码仍然没有结果

代码语言:javascript
复制
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();
                        }
                    }
                });
            }
        });

我就是这样订阅的

代码语言:javascript
复制
loginObservable
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())

                .subscribe(observer);

获得android.os.NetworkOnMainThreadException在这个Response response = httpAuth.loginToken("Token", TOKEN_NEW);

请帮帮忙。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-14 11:43:18

您只将onClickListener设置为Schedulers.newThread()中的按钮,但是在onClick中执行的代码在主线程上运行。这就是例外的原因。

票数 1
EN

Stack Overflow用户

发布于 2017-07-14 12:01:25

当您订阅Observable时,您只是将一个clickListener设置为您的Button。您应该做的是创建这样一个逻辑:

代码语言:javascript
复制
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操作符。

代码语言:javascript
复制
RxView.clicks(btSignin) // this creates an Observable

另一个好建议是使用Retrofit进行网络请求。通过这种方式,您可以直接获得发出响应的Observable

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45102040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档