NetworkOnMainThreadException 在 Android 中使用 RX2
NetworkOnMainThreadException using RX2 in Android
在此研究 RX 实现。
我的问题:
可以在此处 运行 此代码而无需任何 asynctask/runnable 吗?
据我了解,RX 为自己创建了新线程。它能让 运行 可用吗?
此代码 returns NetworkOnMainThreadException
class 测试互联网
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 通过 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());
}
在此研究 RX 实现。
我的问题: 可以在此处 运行 此代码而无需任何 asynctask/runnable 吗? 据我了解,RX 为自己创建了新线程。它能让 运行 可用吗? 此代码 returns NetworkOnMainThreadException
class 测试互联网
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 通过 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());
}