gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 21:20:26 24 4
gpt4 key购买 nike

我在执行 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com