最近在做以http带参数的接口来获取(下发)数据,最初在vivo手机(android7.0)上稍做调试就完美手工。
然而boss希望在平板(华为最新款)上运用这个软件,本以为也就是随意安装下就可以了,却发现运行获取数据时,第一次完美接受,第二次却直接闪退!
当时蒙圈了,然后调试发现,第二次居然没有运行http,直接崩溃。
找到bug所在:
android.os.NetworkOnMainThreadException
问百度,才知道, 在Android4.0以后,会发现,只要是写在主线程(就是Activity)中的HTTP请求,运行时都会报错,这是因为Android在4.0以后为了防止应用的ANR(Aplication Not Response)异常,Android这个设计是为了防止网络请求时间过长而导致界面假死的情况发生。
知道症状了,就得下猛药了,作为萌新,我只得一个个尝试了。
1.http改成https
这个条件一般不会实现,https那是需要证书认证、域名备案之后才可以使用的
个人果断pass
2.targetSdkVersion 降到27以下
这个有的说可以用,有的说不可以用,因人而异,不过可以尝试下
个人调试无果
3.创建允许访问http的参数配置
第一步:配置xml
代码:
<?xml version="1.0" encoding="utf-8"?>
<!--Android 9.0 https请求适配-->
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
第二步:在APP的AndroidManifest.xml文件下的application标签增加属性
代码:
android:networkSecurityConfig="@xml/network_security_config"
这个有人说可以用,可能是我个人的程序逻辑问题,还是不能解决,所以继续...
4.创建新的线程
1.使用单独线程进行网络操作,将结果进行回传:
new Thread(new Runnable()
{
@Override
public void run() {
Message m = new Message();
m.what = 0;
m.obj=//你的网络操作
handler.sendMessage(m);
}
}
}
2.获取网络操作结果:
handler = new Handler() {
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == 0) {
//获取你的消息;
} else if (msg.what == 1) {
}
}
};
额...这个我的http本身就有线程,所以这个对我个人没作用
5.AsyncTask的用法
这个我个人没尝试,大家可以去尝试下,据说用过的效果还是蛮不错的
这是大神写的:https://www.cnblogs.com/dawei/archive/2011/04/18/2019903.html#2824345
6.Activity的onCreate()方法中加入这样一段代码,我个人成功了!!
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
如果还有别的方法,请不要吝啬您的劳动成果,分享他人,岂不美哉?
欢迎在下方留言哈!