首页 > 解决方案 > 在 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();
            }

        }

标签: javaandroidsystem.reactive

解决方案


您有此异常,因为您在此行中对 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()); 

    }


推荐阅读