【问题标题】:NetworkOnMainThreadException using RX2 in Android在 Android 中使用 RX2 的 NetworkOnMainThreadException
【发布时间】:2019-07-30 14:09:52
【问题描述】:

在这里学习 RX 实现。

我的问题: 可以在没有任何异步任务/可运行的情况下在这里运行此代码吗? 据我了解,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();
            }

        }

【问题讨论】:

  • 你有权限吗?
  • INTERNET & ACCESS_NETWORK_STATE
  • 你实现了 Observable 吗?
  • Марат Зангиев 的回答完美地解释了。需要从观察者内部调用(不仅仅是返回观察者真或假)
  • 很好,这很重要!

标签: java android system.reactive


【解决方案1】:

你有这个例外是因为你在 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()); 

    }

【讨论】:

  • 你是老板!
猜你喜欢
  • 2018-12-15
  • 1970-01-01
  • 2017-09-29
  • 2015-03-11
  • 1970-01-01
  • 2012-11-16
  • 2015-01-01
  • 2021-03-21
  • 1970-01-01
相关资源
最近更新 更多