android.os.NetworkOnMainThreadException

诗林  金牌会员 | 2024-9-14 09:42:06 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 724|帖子 724|积分 2172

题目

  1. android.os.NetworkOnMainThreadException
复制代码
详细题目

焦点代码如下:
  1. import android.os.Bundle;
  2. import androidx.appcompat.app.AppCompatActivity;
  3. import java.io.BufferedReader;
  4. import java.io.IOException;
  5. import java.io.InputStreamReader;
  6. import java.net.HttpURLConnection;
  7. import java.net.URL;
  8. import java.util.List;
  9. public class HomeActivity extends AppCompatActivity {
  10.     @Override
  11.     protected void onCreate(Bundle savedInstanceState) {
  12.         super.onCreate(savedInstanceState);
  13.         setContentView(R.layout.activity_home);
  14.         try {
  15.             getData();
  16.         } catch (IOException e) {
  17.             e.printStackTrace();
  18.         }
  19.     }
  20.     private List<MyDataType> getData() throws IOException {
  21.         String apiUrl = "http://api-url";
  22.         URL url = new URL(apiUrl);
  23.         HttpURLConnection connection = (HttpURLConnection) url.openConnection();
  24.         // 设置请求方法为GET
  25.         connection.setRequestMethod("GET");
  26.         // 获取响应代码
  27.         int responseCode = connection.getResponseCode();
  28.         if (responseCode == HttpURLConnection.HTTP_OK) {
  29.             // 读取响应内容
  30.             BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
  31.             StringBuilder response = new StringBuilder();
  32.             String line;
  33.             while ((line = reader.readLine()) != null) {
  34.                 response.append(line);
  35.             }
  36.             reader.close();
  37.             // 将响应内容转换为Weather对象列表(这里的实现取决于你的服务端返回的数据结构)
  38.             List<MyDataType> dataList = parseResponse(response.toString());
  39.             return dataList;
  40.         } else {
  41.             // 处理错误情况
  42.             System.out.println("HTTP request failed with code: " + responseCode);
  43.             return null;
  44.         }
  45.     }
  46.     // 解析响应内容,将其转换为Weather对象列表
  47.     private static List<MyDataType> parseResponse(String response) {
  48.         // 这里需要根据实际情况解析返回的数据,将其转换为Weather对象列表
  49.         // 请根据你的实际返回数据结构进行实现
  50.         // 示例实现可能需要使用 JSON 解析库(如 Jackson、Gson)来处理 JSON 数据
  51.         return null;
  52.     }
  53. }
复制代码
控制台报错信息如下:
  1. 2024-01-14 11:57:54.617 12108-12108/com.example.assistingagriculture E/AndroidRuntime: FATAL EXCEPTION: main    Process: com.example.assistingagriculture, PID: 12108    android.os.NetworkOnMainThreadException
  2.         at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1605)        at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:116)        at java.net.SocketOutputStream.write(SocketOutputStream.java:161)        at com.android.okhttp.okio.Okio$1.write(Okio.java:78)        at com.android.okhttp.okio.AsyncTimeout$1.write(AsyncTimeout.java:157)        at com.android.okhttp.okio.RealBufferedSink.flush(RealBufferedSink.java:222)        at com.android.okhttp.internal.http.Http1xStream.finishRequest(Http1xStream.java:163)        at com.android.okhttp.internal.http.HttpEngine.readNetworkResponse(HttpEngine.java:748)        at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:622)        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:475)        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:411)        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:542)        at com.example.assistingagriculture.HomeActivity.getNearestLongitudeAndLatitude(HomeActivity.java:117)        at com.example.assistingagriculture.HomeActivity.lambda$requestLocation$0$com-example-assistingagriculture-HomeActivity(HomeActivity.java:79)        at com.example.assistingagriculture.HomeActivity$$ExternalSyntheticLambda1.onSuccess(Unknown Source:4)        at com.google.android.gms.tasks.zzn.run(com.google.android.gms:play-services-tasks@@17.2.0:4)        at android.os.Handler.handleCallback(Handler.java:938)        at android.os.Handler.dispatchMessage(Handler.java:99)        at android.os.Looper.loop(Looper.java:223)        at android.app.ActivityThread.main(ActivityThread.java:7656)        at java.lang.reflect.Method.invoke(Native Method)        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)2024-01-14 11:57:54.627 12108-12108/? I/Process: Sending signal. PID: 12108 SIG: 9
复制代码
解决方案

步骤1、在项目目次\app\src\main\AndroidManifest.xml中添加
  1. <uses-permission android:name="android.permission.INTERNET"/>
复制代码
具体操作如下图所示:

表明:数据请求设计网络访问,需要为项目配置网络权限
步骤2、对于上述代码修改,具体修改如下:
  1. import android.os.AsyncTask;
  2. import android.os.Bundle;
  3. import androidx.appcompat.app.AppCompatActivity;
  4. import java.io.BufferedReader;
  5. import java.io.IOException;
  6. import java.io.InputStreamReader;
  7. import java.net.HttpURLConnection;
  8. import java.net.URL;
  9. import java.util.List;
  10. public class HomeActivity extends AppCompatActivity {
  11.     @Override
  12.     protected void onCreate(Bundle savedInstanceState) {
  13.         super.onCreate(savedInstanceState);
  14.         setContentView(R.layout.activity_home);
  15.         // 此处需修改,添加如下行代码 作用:启动异步任务
  16.         new GetDataAsyncTask().execute();
  17.     }
  18.         // 此处需修改,添加如下类代码 作用:构造异步任务类
  19.     private class GetDataAsyncTask extends AsyncTask<Void, Void, List<MyDataType>> {
  20.         @Override
  21.         protected List<MyDataType> doInBackground(Void... voids) {
  22.             try {
  23.                 return getData();
  24.             } catch (IOException e) {
  25.                 e.printStackTrace();
  26.                 return null;
  27.             }
  28.         }
  29.         @Override
  30.         protected void onPostExecute(List<MyDataType> result) {
  31.             // 在UI线程中处理获取到的数据
  32.             if (result != null) {
  33.                 // 处理数据
  34.             } else {
  35.                 // 处理错误情况
  36.             }
  37.         }
  38.     }
  39.     private List<MyDataType> getData() throws IOException {
  40.         String apiUrl = "http://api-url";
  41.         URL url = new URL(apiUrl);
  42.         HttpURLConnection connection = (HttpURLConnection) url.openConnection();
  43.         // 设置请求方法为GET
  44.         connection.setRequestMethod("GET");
  45.         // 获取响应代码
  46.         int responseCode = connection.getResponseCode();
  47.         if (responseCode == HttpURLConnection.HTTP_OK) {
  48.             // 读取响应内容
  49.             BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
  50.             StringBuilder response = new StringBuilder();
  51.             String line;
  52.             while ((line = reader.readLine()) != null) {
  53.                 response.append(line);
  54.             }
  55.             reader.close();
  56.             // 将响应内容转换为Weather对象列表
  57.             return parseResponse(response.toString());
  58.         } else {
  59.             // 处理错误情况
  60.             System.out.println("HTTP request failed with code: " + responseCode);
  61.             return null;
  62.         }
  63.     }
  64.     // 解析响应内容,将其转换为Weather对象列表
  65.     private static List<MyDataType> parseResponse(String response) {
  66.         // 实现解析逻辑
  67.         return null;
  68.     }
  69. }
复制代码
题目原因

这个错误是由于笔者在主线程(UI线程)上举行了网络操作,而Android不允许在主线程上执行耗时的网络操作,由于这大概会导致应用界面的卡顿。
解决方案

将网络操作移到后台线程上执行即可。使用异步任务 (AsyncTask) 或者 Thread 来执行网络请求,将网络请求放在 doInBackground 方法中。
参考文献

How can I fix ‘android.os.NetworkOnMainThreadException
’?

部分内容参考chatgpt
原创不易
转载请标明出处
假如对你有所帮助 别忘啦点赞支持哈


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

诗林

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表