java - android.os.NetworkOnMainThreadException 在 android 上使用 rxjava

标签 java android rx-java

我在执行 rxJava 时遇到了问题,以便检查 android 上是否有互联网连接,我是这样做的:

在我的启动器 Activity 中,我在 onCreate 中有这个:

AndroidObservable.bindActivity(this,
            Observable.just(Utils.isActiveInternetConnection(Launcher.this)))
            .subscribeOn(Schedulers.newThread())
            .subscribe(new Action1<Boolean>() {
                @Override
                public void call(Boolean aBoolean) {
                    if (aBoolean) {
                        Toast.makeText(Launcher.this, "There is internet connection", Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(Launcher.this, "There is no internet connection", Toast.LENGTH_SHORT).show();
                    }
                }
            });

我有一个 Utils 类,它是一个带有静态方法的最终类,observable 正在使用的方法是这个:

    public static boolean isActiveInternetConnection(Context context) {
    if (isNetworkAvailable(context)) {
        try {
            HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.google.com").openConnection());
            urlc.setRequestProperty("User-Agent", "Test");
            urlc.setRequestProperty("Connection", "close");
            urlc.setConnectTimeout(1500);
            urlc.connect();
            return (urlc.getResponseCode() == 200);
        } catch (IOException e) {
            Log.e("network", "Error checking internet connection", e);
        }
    } else {
        Log.d("network", "No network available!");
    }
    return false;
}

private static boolean isNetworkAvailable(Context context){
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    if (null != activeNetwork) {
        return true;
    }
    else {
        return false;
    }
}

我收到 android.os.NetworkOnMainThreadException,我找不到原因,在此先感谢。

最佳答案

Observable.just(...) 在调用线程(在本例中为主线程)上立即被调用。您的代码实际上只是一个内联版本:

boolean activeConn = Utils.isActiveInternetConnection(Launcher.this);
AndroidObservable.bindActivity(this, 
        Observable.just(activeConn))
        .subscribeOn(...)
        ...

您已尝试通过调用 subscribeOn() 将其移出主线程 - 但调用已经发生。

我们处理这个问题的方式(我不确定这是最好的方式,但它有效)是推迟网络或阻塞调用直到订阅发生,设置可观察对象在正确的线程上运行,并且然后订阅:

AndroidObservable.bindActivity(this,
        Observable.defer(new Func0<Boolean>() {
            @Override
            public Observable<Observable<Boolean>> call() {
                return Observable.just(Utils.isActiveInternetConnection(Launcher.this));
            }
        })
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Action1<Boolean>() {
            @Override
            public void call(Boolean aBoolean) {
                if (aBoolean) {
                    Toast.makeText(Launcher.this, "There is internet connection", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(Launcher.this, "There is no internet connection", Toast.LENGTH_SHORT).show();
                }
            }
        });

关于java - android.os.NetworkOnMainThreadException 在 android 上使用 rxjava,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27687907/

相关文章:

java - RxJava : observable that contains an asynchronous call

javascript - Rx.Observable.groupBy 会清理空流吗?

java - 分享 Instagram Story 的贴纸坏了?

rxjs - 接收 : Force observable to take at least N seconds to complete

java - 非法访问 : this web application instance has been stopped already. 无法加载 org.apache.log4j.spi.NOPLoggerRepository

android - 合并 2 个 observable 并从第一个完成的 observable 中获取输出

ANDROID。如何在不出现谷歌弹出窗口的情况下对文本进行语音输入?

java - Android App Bundle 在 Android 应用中引入 Resource Not found crash

java - 运行时异常和错误

Java 正则表达式和多行