目录
解决:
在android的androidManifest.xml中添加
<uses-permission android:name="android.permission.INTERNET" />
以开启网络访问权限。
由于http的保密性差,截止到目前2022年9月3日,安卓允许发起https网络请求,而限制http请求访问。
解决:
在android的androidManifest.xml中添加
android:usesCleartextTraffic="true"
解除android对http访问的限制。
在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();
-
- }
- }