android.os.NetworkOnMainThreadException

这篇具有很好参考价值的文章主要介绍了android.os.NetworkOnMainThreadException。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题

android.os.NetworkOnMainThreadException

详细问题

核心代码如下:

import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;

public class HomeActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);
        try {
            getData();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    private List<MyDataType> getData() throws IOException {
        String apiUrl = "http://api-url";

        URL url = new URL(apiUrl);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();

        // 设置请求方法为GET
        connection.setRequestMethod("GET");

        // 获取响应代码
        int responseCode = connection.getResponseCode();

        if (responseCode == HttpURLConnection.HTTP_OK) {
            // 读取响应内容
            BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            StringBuilder response = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                response.append(line);
            }
            reader.close();
            // 将响应内容转换为Weather对象列表(这里的实现取决于你的服务端返回的数据结构)
            List<MyDataType> dataList = parseResponse(response.toString());

            return dataList;
        } else {
            // 处理错误情况
            System.out.println("HTTP request failed with code: " + responseCode);
            return null;
        }
    }

    // 解析响应内容,将其转换为Weather对象列表
    private static List<MyDataType> parseResponse(String response) {
        // 这里需要根据实际情况解析返回的数据,将其转换为Weather对象列表
        // 请根据你的实际返回数据结构进行实现
        // 示例实现可能需要使用 JSON 解析库(如 Jackson、Gson)来处理 JSON 数据
        return null;
    }
}

控制台报错信息如下:

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
        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中添加

<uses-permission android:name="android.permission.INTERNET"/>

具体操作如下图所示:
android.os.NetworkOnMainThreadException,android,.net

解释:数据请求设计网络访问,需要为项目配置网络权限

步骤2、对于上述代码修改,具体修改如下:

import android.os.AsyncTask;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;

public class HomeActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);
        // 此处需修改,添加如下行代码 作用:启动异步任务
        new GetDataAsyncTask().execute(); 
    }
	// 此处需修改,添加如下类代码 作用:构造异步任务类
    private class GetDataAsyncTask extends AsyncTask<Void, Void, List<MyDataType>> {
        @Override
        protected List<MyDataType> doInBackground(Void... voids) {
            try {
                return getData();
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }
        }

        @Override
        protected void onPostExecute(List<MyDataType> result) {
            // 在UI线程中处理获取到的数据
            if (result != null) {
                // 处理数据
            } else {
                // 处理错误情况
            }
        }
    }

    private List<MyDataType> getData() throws IOException {
        String apiUrl = "http://api-url";
        URL url = new URL(apiUrl);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();

        // 设置请求方法为GET
        connection.setRequestMethod("GET");

        // 获取响应代码
        int responseCode = connection.getResponseCode();

        if (responseCode == HttpURLConnection.HTTP_OK) {
            // 读取响应内容
            BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            StringBuilder response = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                response.append(line);
            }
            reader.close();
            // 将响应内容转换为Weather对象列表
            return parseResponse(response.toString());
        } else {
            // 处理错误情况
            System.out.println("HTTP request failed with code: " + responseCode);
            return null;
        }
    }

    // 解析响应内容,将其转换为Weather对象列表
    private static List<MyDataType> parseResponse(String response) {
        // 实现解析逻辑
        return null;
    }
}

问题原因

这个错误是由于笔者在主线程(UI线程)上进行了网络操作,而Android不允许在主线程上执行耗时的网络操作,因为这可能会导致应用界面的卡顿。

解决方案

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

参考文献

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

部分内容参考chatgpt

原创不易
转载请标明出处
如果对你有所帮助 别忘啦点赞支持哈
android.os.NetworkOnMainThreadException,android,.net文章来源地址https://www.toymoban.com/news/detail-801785.html

到了这里,关于android.os.NetworkOnMainThreadException的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • rk3568 安卓11 修改android id

    frameworksbasepackagesSettingsProvidersrccomandroidproviderssettingsSettingsProvider.java 系统应用获取的android id 直接写死 上层普通应用 android id跟着sn变化 android id跟着IMEI变化

    2024年04月28日
    浏览(48)
  • Android 和 IOS 设备唯一ID如何选择

            我们在做Android/IOS应用或游戏的时候,或许总会碰到要获取设备唯一id来标识或跟踪玩家。但随着系统安全性的提高,加强用户的隐私安全,获取设备唯一ID变得越来越困难了,下面我们来分析一下,看看哪些还可以满足我们需求,同时,如果您有关于获取设备唯一

    2024年01月19日
    浏览(37)
  • Android设备的各种唯一标识符 ID

    只有Android手机才有, IMEI号是一串15位的号码,比如像这样 359881030314356 需要权限 android.permission.READ_PHONE_STATE 通常用户会因为你向他们要了这个权限而给你一个差评,因为他们觉得你就是在窃取他们的隐私,很明显,你就是在收集一些数据 这个是不靠谱的,因为有时候它是

    2024年02月11日
    浏览(60)
  • Android studio报错:Plugin [id: ‘com.android.application‘, version: ‘7.2.0‘

    之前我是在笔记本电脑上安装的Android studio,是能使用的好好的,但是这次在新台式电脑上安装Android studio之后新建project发现报错:Plugin [id: \\\'com.android.application\\\', version: \\\'7.2.0\\\', apply: false] was not found in any of the following sources 1、试过将Android studio文件Gradle Script下面的gradle-wrapper.

    2024年02月17日
    浏览(42)
  • Android报错 Failed to apply plugin [id ‘com.android.internal.application‘]

    今天打开项目运行出现两条错误: 1、org.gradle.api.internal.plugins.PluginApplicationException: Failed to apply plugin [id ‘com.android.internal.application’] 2、org.gradle.api.tasks.StopExecutionException: Your project path contains non-ASCII characters. This will most likely cause the build to fail on Windows. Please move your project to

    2024年02月16日
    浏览(49)
  • Android 13(targetSdkVersion:33)必需添加com.google.android.gms.permission.AD_ID

    关于这个问题个人觉得Google真有点变态。 大概的意思是:你要适配Android 13,必须将targetSdkVersion升至33,这都很正常;你必须添加com.google.android.gms.permission.AD_ID的权限获取,OK,虽然不知道我的APP没有广告为何一定要我加这个,你要加就加呗!!!但变态的是在提交新版本审核

    2024年02月11日
    浏览(48)
  • Android studio 报错 Plugin [id: ‘com.android.application‘, version: ‘8.1.0‘, apply: false]

    之前的项目可以运行,过一阵再次打开发现报错如下。但是新建Android studio 项目没有问题可以运行。 很久没有查到原因缺的version: \\\'8.1.0\\\'之前已经下载过也不知道为啥还要提示下载 然后就是下载失败 问题后来问题解决 将上边路径修改如下 点击🆗 等待下载完成问题解决

    2024年02月03日
    浏览(57)
  • 小米市场驳回:umeng-commonsdk收集Android ID (P系列)

    一般的隐私政策都是用webview去加载一个url呈现。 但后来市场说你的webview在获取设备的android id,不合规。 所以初次加载,用户未同意隐私政策前,就用TextView加载。把url的内容下载下来显示。 但发现小米还是说你的包有问题,说友盟sdk在收集android id,巴拉巴拉一堆。 报告调

    2024年01月17日
    浏览(38)
  • ​ Android 操作系统用于获取设备的软件版本号 ​ro.build.id

    getprop ro.build.id 是一个 Android 操作系统中的命令,通常用于获取设备的软件版本号。其中,ro.build.id 是一个系统属性的名称,它存储了当前设备的软件版本标识符。 要使用 getprop ro.build.id 命令,可以在 Android 设备上的命令行界面(如终端或adb shell)中输入该命令并按下回车键

    2024年02月05日
    浏览(37)
  • Android studio 出现Plugin [id: ‘com.android.application‘, version: ‘8.1.0‘, apply: false] 问题解决办法

    新建项目下Gradle sync报错:Plugin [id \\\'com.android.application\\\' version \\\'7.1.2\\\' apply false] was not found in any of the following sources: 相信你在网上各种搜索答案,尝试了各种设置Http proxy,也配置了很多仓库,还是不能解决问题。 解决过程 在问题排除过程中,根据网上的博客猜测是版本Gradle和

    2024年04月15日
    浏览(93)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包