java - 在 Android 中使用 RX2 的 NetworkOnMainThreadException
问题描述
在这里研究 RX 实现。
我的问题:可以在没有任何 asynctask/runnable 的情况下在这里运行此代码吗?据我了解,RX 为自己制作了新线程。它可以运行吗?此代码返回 NetworkOnMainThreadException
类TestInternet
public class TestInternet implements SOService.TestInternet {
//TIMEOUT EN MILISEGUNDOS
private final int MILISECONDS = 3000;
@Override
//returns the observable with connection/no connection
public Observable <Boolean> getObservableConnection(String filter) {
Observable<Boolean> networkAvalaible;
try {
URL myUrl = new URL("http://flickr.com");
URLConnection connection = myUrl.openConnection();
connection.setConnectTimeout(MILISECONDS);
connection.connect();
networkAvalaible = Observable.just(true);
} catch (Exception e) {
//I'm catching NetworkInMainThreadException here
e.printStackTrace();
networkAvalaible = Observable.just(false);
Log.d("error en testinternet",e.toString());
}
return networkAvalaible.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread());
}
来自presenter.java
testInternet.getObservableConnection(filtro).subscribeWith(getConnectionObserver());
//comprueba conexión
public DisposableObserver<Boolean> getConnectionObserver() {
return new DisposableObserver<Boolean>() {
@Override //envia los datos al recyclerview
public void onNext(@NonNull Boolean aBoolean) {
Log.d("rx","CONNECTION HAY NEXT");
//envia los datos al recyclerview
if (!aBoolean){
Log.d("connnexcion", aBoolean.toString());
mainView.showError(mainView.getContext().getText(R.string.no_connected).toString());
}else if (aBoolean){
Log.d("connnexcion", "on next correcto");
mainView.hideError();
}
}
解决方案
您有此异常,因为您在此行中对 Android MainThread 进行了网络调用:
URLConnection connection = myUrl.openConnection();
Rx handle multithreading by Schedulers
(subscribeOn(Schedulers.newThread())
在您的代码中)。但是你在一个外部进行网络调用Observable
将你的调用包装在一个内部Observable
并且它会起作用
您编辑的代码
public class TestInternet implements SOService.TestInternet {
//TIMEOUT EN MILISEGUNDOS
private final int MILISECONDS = 3000;
@Override
//returns the observable with connection/no connection
public Observable <Boolean> getObservableConnection(String filter) {
return Observable.create(new ObservableOnSubscribe<Boolean>() {
@Override
public void subscribe(ObservableEmitter<Boolean> emitter) throws Exception {
try {
URL myUrl = new URL("http://flickr.com");
URLConnection connection = myUrl.openConnection();
connection.setConnectTimeout(MILISECONDS);
connection.connect();
emitter.onNext(true);
} catch (Exception e) {
//I'm catching NetworkInMainThreadException here
e.printStackTrace();
emitter.onNext(false);
Log.d("error en testinternet", e.toString());
}
}
})
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread());
}
推荐阅读
- javascript - 使用 tr 类获取 td 文本节点的 Javascript
- vba - 如果文件超过一定的行数,Excel 宏会抛出错误
- node.js - npm 注册表更改 - 仍然从旧注册表中下载了一些库。
- grafana - Graphite:合并包含多个值的系列
- python - 简单的布尔逻辑给出不明确的错误
- jquery - 更改课程时为 div 设置动画
- highcharts - 如何在highcharts(Rcharts)中将某些列设置为气泡图数据标签?
- python - Python 不会在第一个之后执行任何 elif 语句
- webgl - 使用 gl.uniform1fv 上传的数组的最大大小是多少?
- string - 如何使用 AWK 反向打印每个单元格中的字符串字符?