android - 通过 HttpURLConnection 函数连接到 Internet 时出现 Android 应用程序错误
问题描述
我有谁的功能是检测手机的互联网连接是否可用,如果可用,它是否可以实际连接到互联网。
代码的第一部分运行良好,即检测手机的移动数据或 wi-fi 是否打开。如果 Internet 已打开,则该函数会尝试连接到网页,HttpURLConnection
以检测 Internet 连接是否可以实际访问 Internet。
不幸的是,该应用程序一直在崩溃,并且根据 logcat 错误,该错误与此代码一致urlc.connect()
。
根据 logcat,MainActivity.java 上的第 21 行包含这段代码:utils.network()
. Utils.java 的第 93 行包含这段代码:urlc.connect()
public void network() {
ConnectivityManager cm = (ConnectivityManager)_con.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting();
if (isConnected) {
msg = "Internet Available";
try {
HttpURLConnection urlc = (HttpURLConnection)
(new URL("http://clients3.google.com/generate_204")
.openConnection());
urlc.setRequestProperty("User-Agent", "Android");
urlc.setRequestProperty("Connection", "close");
urlc.setConnectTimeout(1500);
urlc.connect();
if (urlc.getResponseCode() == HttpURLConnection.HTTP_OK) {
msg += " and is connecting.";
} else {
msg += " but not connecting";
}
Log.e(TAG, "NO Error checking internet connection");
} catch (IOException e) {
Log.e(TAG, "Error checking internet connection", e);
}
} else {
msg = "Internet Unavailable";
}
Toast toast = Toast.makeText(_con, msg, Toast.LENGTH_LONG);
toast.show();
}
LOGCAT
09-08 06:02:00.534 4476-4476/com.appsite.appname E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.appsite.appname, PID: 4476
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.appsite.appname/com.appsite.appname.MainActivity}: android.os.NetworkOnMainThreadException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2572)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2654)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1488)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:207)
at android.app.ActivityThread.main(ActivityThread.java:5728)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)
Caused by: android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1288)
at java.net.InetAddress.lookupHostByName(InetAddress.java:432)
at java.net.InetAddress.getAllByNameImpl(InetAddress.java:253)
at java.net.InetAddress.getAllByName(InetAddress.java:215)
at com.android.okhttp.internal.Network$1.resolveInetAddresses(Network.java:29)
at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:188)
at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:157)
at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:100)
at com.android.okhttp.internal.http.HttpEngine.createNextConnection(HttpEngine.java:368)
at com.android.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:351)
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:341)
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:259)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:454)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:114)
at com.appsite.appname.utils.Utils.network(Utils.java:93)
at com.appsite.appname.MainActivity.onCreate(MainActivity.java:21)
at android.app.Activity.performCreate(Activity.java:6301)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1113)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2519)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2654)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1488)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:207)
at android.app.ActivityThread.main(ActivityThread.java:5728)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)
解决方案
您正在主线程上发出网络请求。使用后台线程发出网络请求。这是问题的根源。
Caused by: android.os.NetworkOnMainThreadException
推荐阅读
- python - 在使用 Python 将 CSV 转换为 Excel 后,所有标题都放入一列?
- javascript - InputNumber Ant.Design 中“Number.toFixed() 数字参数必须在 0 到 100 之间”问题的解决方案
- oauth-2.0 - spring boot OAuth2.0 使用linkedin进行社交登录
- python - 第一个从服务器接收信息的客户端不起作用 python
- python - 如何比较两个数据框以在第三个数据框中创建列?
- django - Django 框架:URL 错误?我的导师不知道
- r - 在循环内使用 n-1 计算
- javascript - 在 html 页面中编写所有 js 代码并将该 html 页面包含在另一个 html 页面而不是 .js 文件中是一种好方法吗?
- python - NumPy:将多维索引的子集传递给数组
- postgresql - 尝试创建对我的 postgres 数据库的复制时出错