在android应用开发过程中,经常需要通过网络请求获取服务端的数据,通过网络请求提交客户端的数据到服务器端等场景;以下整理在android网络请求开发过程中新手开发者时常遇到的问题~
android.os.NetworkOnMainThreadException
![](https://img.haomeiwen.com/i10757921/09dd2ec53f2ffe8d.png)
出现这种问题的原因是由于在主线程中进行了网络请求操作,android下不建议在主线程中进行网络请求操作,因为这可能会造成UI界面的卡顿,引起应用性能问题等
那么怎么确定当前线程是不是主线程?
可以通过代码Thread.currentThread().getName()来打印出当前上下文的线程名称,来观察当前环境,打印结果中显示是main线程的话,那就说明当前是在主线程上下文中执行操作了
![](https://img.haomeiwen.com/i10757921/e5610ff25dff7681.png)
![](https://img.haomeiwen.com/i10757921/3636e8b52a11c049.png)
解决方案:应该在非主线程环境下进行网络请求的操作,也就是在别的线程中来开发网络请求的代码,来规避问题,使用new Thread新建线程调用测试,观察结果可以发起网络请求了
![](https://img.haomeiwen.com/i10757921/6df415229f812041.png)
![](https://img.haomeiwen.com/i10757921/bc66e6ff78246cec.png)
在不同的网络请求库中有相应的线程调用解决方案说明,请详细查询自己使用的网络请求库开发文档来优雅的解决这样的问题
No address associated with hostname
![](https://img.haomeiwen.com/i10757921/0d8bde76acae026a.png)
出现这种问题的原因是由于该应用没有访问网络的权限,不能使用网络套接字
解决方案:修改AndroidManifest.xml清单配置,增加如下的网络访问权限配置声明
<uses-permission android:name="android.permission.INTERNET"/>
![](https://img.haomeiwen.com/i10757921/05b47e92fec57651.png)
保存配置,再重新启动app调试就会发现可以正常使用网络请求了
not permitted by network security policy
![](https://img.haomeiwen.com/i10757921/aca299582254d241.png)
由于android网络访问明文传输被限制,需要配置策略允许访问
解决方案:修改AndroidManifest.xml清单配置,修改application增加如下属性配置
android:networkSecurityConfig="@xml/network_security_config"
![](https://img.haomeiwen.com/i10757921/ef7310b4a39be4a2.png)
同时添加res/xml/network_security_config.xml资源文件
![](https://img.haomeiwen.com/i10757921/5080a073b36cad50.png)
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
配置好后重新启动应用调试,发起网络请求操作发现没有问题了
网友评论