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()); 

    }