• 初识Android开发中网络请求报错解决及其总结


    目录

    1:android请求访问网络失败。

    2:http访问请求失败,安卓报错xxx。

    3:主线程发起网络请求异常

    第一种解除限制 (简单)

    第二种 通过子线程发起网络请求。


    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中添加

    1. StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    2. StrictMode.setThreadPolicy(policy);

    第二种 通过子线程发起网络请求。

    我遇到这一点一般在用户与组件进行交互时需要发起网络请求,以更新UI数据,所以需要主线程与子线程通信

    比如监听三个按钮是否按下发起网络请求控制外接传感器设备。

    在activity的oncreate里设计按钮监听事件处理(主线程将数据打包给子线程的handler发Message)

    1. SubThread subThread=new SubThread();
    2. subThread.start();
    3. //控制设备1-3的常规开和关
    4. dev1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    5. @Override
    6. public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
    7. Map[] li=new Map[2];
    8. if (dev1.isChecked()) {
    9. Log.e(TAG, "ON DEV1");
    10. try {
    11. li[0]=new HashMap();
    12. li[1]=new HashMap();
    13. li[0].put("name","dev1");
    14. li[1].put("val","1");
    15. Message msg=Message.obtain();
    16. msg.what=1;
    17. msg.obj=li;
    18. subThread.subhandler.sendMessage(msg);
    19. Toast.makeText(Conrrol.this, "开启设备1", Toast.LENGTH_SHORT).show();
    20. } catch (Exception e) {
    21. e.printStackTrace();
    22. Toast.makeText(Conrrol.this, "操作失败", Toast.LENGTH_SHORT).show();
    23. }
    24. }
    25. else {
    26. Log.e(TAG, "OFF DEV1");
    27. try {
    28. li[0]=new HashMap();
    29. li[1]=new HashMap();
    30. li[0].put("name","dev1");
    31. li[1].put("val","0");
    32. Message msg=Message.obtain();
    33. msg.what=1;
    34. msg.obj=li;
    35. subThread.subhandler.sendMessage(msg);
    36. Toast.makeText(Conrrol.this, "关闭设备1", Toast.LENGTH_SHORT).show();
    37. } catch (Exception e) {
    38. e.printStackTrace();
    39. Toast.makeText(Conrrol.this, "操作失败", Toast.LENGTH_SHORT).show();
    40. }
    41. }
    42. }
    43. });

     

     子线程的handler收到数据将数据解析进行网络访问.

    1. class SubThread extends Thread {
    2. private Handler subhandler;
    3. public void run() {
    4. Looper.prepare();
    5. subhandler = new Handler(Looper.myLooper()) {
    6. @Override
    7. public void handleMessage(Message msg) {
    8. switch (msg.what) {
    9. case 1:
    10. Map[] li= (Map[]) msg.obj;
    11. try {
    12. DAO.ControlDec((String) li[0].get("name"),(String) li[1].get("val"));
    13. Log.e(TAG, "success" );
    14. } catch (Exception e) {
    15. e.printStackTrace();
    16. }
    17. break;
    18. case 2:
    19. break;
    20. case 3:
    21. break;
    22. default:
    23. break;
    24. }
    25. }
    26. };
    27. Looper.loop();
    28. }
    29. }

  • 相关阅读:
    力扣打卡之斐波那契数列
    前端数据可视化之【Echarts介绍】
    从 Wepy 到 UniApp 变形记
    【论文笔记】Far3D: Expanding the Horizon for Surround-view 3D Object Detection
    自动化测试总计
    网络安全(黑客)自学
    C++:static:谈一谈static关键字
    Windows C++ 使用WinAPI实现RPC
    快速排序的实现!递归实现!!超详细!!!
    A tour of gRPC:08 - gRPC 反射 与 Evans 客户端
  • 原文地址:https://blog.csdn.net/PHILICS7/article/details/126677844