Android Kotlin实现HTTP GET请求取数插入TextView报错求极简解决方案
错误根因
- 核心报错
android.os.NetworkOnMainThreadException是因为Android系统禁止在UI主线程执行网络操作,你代码中的URL(t.toString()).readText()写在了协程外部,点击事件默认运行在主线程,直接触发了系统拦截 - 额外存在逻辑错误:
t.toString()拿到的是EditText控件的对象字符串,不是用户输入的网址,正确获取输入内容的写法是t.text.toString()
极简修复代码
无需引入OkHttp等第三方库,仅调整代码逻辑即可:
val HTTPget = findViewById<Button>(R.id.buttonPOst) HTTPget.setOnClickListener { val t = findViewById<EditText>(R.id.editTextTextPersonName) val net1 = findViewById<TextView>(R.id.textViewzx) GlobalScope.launch(Dispatchers.IO) { try { // 读取用户输入的URL,在IO线程执行网络请求 val result = URL(t.text.toString()).readText() Log.e("MainActivity", "ADID=$result") // 切回主线程更新TextView withContext(Dispatchers.Main) { net1.text = result } } catch (e: Exception) { // 异常捕获避免网络错误直接崩溃 withContext(Dispatchers.Main) { net1.text = "请求出错:${e.message}" } } } }
必要配置检查
- 必须在
AndroidManifest.xml中添加网络权限,否则会触发无权限错误:
<uses-permission android:name="android.permission.INTERNET" />
- 如果你请求的是HTTP明文协议的地址,需要在
AndroidManifest.xml的application节点添加属性放行明文流量:
<application ... android:usesCleartextTraffic="true">
- 本方案为极简实现,生产环境建议替换GlobalScope为和页面生命周期绑定的协程作用域,避免内存泄漏。
内容的提问来源于stack exchange,提问作者AnxiousDino
相关产品推荐
相关产品推荐

