目录
1:android请求访问网络失败。
解决:
在android的androidManifest.xml中添加
<uses-permission android:name="android.permission.INTERNET" />
以开启网络访问权限。
2:http访问请求失败,安卓报错xxx。
由于http的保密性差,截止到目前2022年9月3日,安卓允许发起https网络请求,而限制http请求访问。
解决:
在android的androidManifest.xml中添加
android:usesCleartextTraffic="true"
解除android对http访问的限制。
3:主线程发起网络请求异常
在android4.0以后则不允许在主线程(UI线程)中发起网络请求。
两种方法
第一种解除限制 (简单)
在activity的 oncrete中添加
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
第二种 通过子线程发起网络请求。
我遇到这一点一般在用户与组件进行交互时需要发起网络请求,以更新UI数据,所以需要主线程与子线程通信。
比如监听三个按钮是否按下发起网络请求控制外接传感器设备。
在activity的oncreate里设计按钮监听事件处理(主线程将数据打包给子线程的handler发Message)
SubThread subThread=new SubThread();
subThread.start();
//控制设备1-3的常规开和关
dev1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
Map[] li=new Map[2];
if (dev1.isChecked()) {
Log.e(TAG, "ON DEV1");
try {
li[0]=new HashMap();
li[1]=new HashMap();
li[0].put("name","dev1");
li[1].put("val","1");
Message msg=Message.obtain();
msg.what=1;
msg.obj=li;
subThread.subhandler.sendMessage(msg);
Toast.makeText(Conrrol.this, "开启设备1", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(Conrrol.this, "操作失败", Toast.LENGTH_SHORT).show();
}
}
else {
Log.e(TAG, "OFF DEV1");
try {
li[0]=new HashMap();
li[1]=new HashMap();
li[0].put("name","dev1");
li[1].put("val","0");
Message msg=Message.obtain();
msg.what=1;
msg.obj=li;
subThread.subhandler.sendMessage(msg);
Toast.makeText(Conrrol.this, "关闭设备1", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(Conrrol.this, "操作失败", Toast.LENGTH_SHORT).show();
}
}
}
});
子线程的handler收到数据将数据解析进行网络访问.
class SubThread extends Thread {
private Handler subhandler;
public void run() {
Looper.prepare();
subhandler = new Handler(Looper.myLooper()) {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
Map[] li= (Map[]) msg.obj;
try {
DAO.ControlDec((String) li[0].get("name"),(String) li[1].get("val"));
Log.e(TAG, "success" );
} catch (Exception e) {
e.printStackTrace();
}
break;
case 2:
break;
case 3:
break;
default:
break;
}
}
};
Looper.loop();
}
}