在还没有真正在android项目中运行我的请求网络通信(使用HttpURLConnection类)的代码的时候,我还天真的以为会和在java项目中一样顺畅的运行的,所有就没多想,照着java中的代码就是一顿复制粘贴,然后,然后...
它崩溃了,我懵逼了。。。
当然,在我抱着把百度查个底朝天的决心,终于是把其中的坑给填上了。
主线程中不能运行网络请求
这是第一个坑,因为一般我们要是在java项目中写网络请求,是不需要用到多线程的。但在Android项目中,我们需要将整段网络请求的代码添加到子线程中:
这是在Android3.0之后的版本中出现的规定。当我们加入了多线程之后就解决了一运行就黑屏的困扰,但这样我们需要注意了,当你有需求要在这个子线程中改变Activity的UI时,就需要回到主线程中编写代码。怎么回来,很简单:
一个runOnUiThread就搞定了,它属于Activity类中的一个方法。
默认不能使用明码传输
没错,在Android P中是禁止使用明码传输的。说明白点,就是你不能再在Android项目中获取和发送http请求了。只能使用带https头的请求。刚开始我感觉这样的设定太坑了吧,但想了想,Google也是为了数据安全着想,也是可以的。那么,怎么判断我们请求的地址真的被禁止了呢,答案是,它会抛出这样一个异常:Cleartext HTTP traffic to xxx not permitted,xxx部分是你要请求的url,很清楚的告诉了你不能使用http这样的明文进行网络通信。怎么解决:
- 把请求改成https头(他说不能用http咋就不用了)
- targetSdkVersion 调到27或是更低的版本(该设定只针对高版本)
- 在AndroidManifest.xml配置文件的标签中直接插 android:usesCleartextTraffic="true"(这样做其实是允许Android明码传输)
- 和第三种方法一个道理,只是换了个更改的方式:
我们先要在res文件夹中创建 network_security_config.xml 的xml文件,然后配置:
保存,然后在清单文件(AndroidManifest.xml)的 application 标签中引用该配置:
网络安全配置更改完成。
使用上述其中一种方法都可以解决这个问题,还是情况吧。
总结
这篇文章我觉得只能算得上是我的一个笔记吧,主要是因为我在这个环节上研究了好久,为了“吸取教训”才写下的这篇文章,也请读者不要太认真,为的只是遇到同样的读者们一个参考。如有错误的地方,请指出,我必积极改正。