• Android应用开发-网络编程①


    1、ANR(Application Not Response)应用程序无响应
    ①当用户输入事件5s内没有得到响应,将会弹出ANR对话框;
    ②广播接收者的onReceive()方法执行时间超过10s会出现ANR;
    ③解决原则:所有耗时操作都要在子线程中进行,包括网络操作、I/O、SDCard、数据运算;
    2、常见错误及解决:
    ①ANR:application not response 应用无响应; androoid中耗时的操作(请求网络,大文件的拷贝,数据库的操作)需要在子线程中做。
    09-02 01:52:40.711:E/ActivityManager(857): ANR in com.zdc.sourcelook(com.zdc.sourcelook/.MainActivity)
    ②4.0后网络操作强制在子线程中进行。因为网络访问是耗时的操作,可能会导致ANR
    09-02 01:57:32.879: W/System.err(1789): android.os.NetworkOnMainThreadException
    ③错误线程调用异常,子线程不能够更新UI(控件的内容)
    09-02 02:02:08.873: W/System.err(1858): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
    ④主线程不能够做耗时的操作,网络请求就是耗时的操作需要放到子线程做。子线程不能更新控件的内容(更新Ui)。所以产生了矛盾,解决办法就是使用Handler.
    3、Handler的使用步骤:
    ①主线程中创建一个Handler
    private Handler handler = new Handler(){
    public void handleMessage(android.os.Message msg) {
    };
    };
    ②重写handler的handlermessage方法
    ③子线程中创建一个Message对象,将获取的数据绑定给msg
    通过指定URL获取有效数据,并解析获取的流数据
    InputStream inputStream = connection.getInputStream();
    // 将一个读取流转换成一个图片(Drawable、Btimap):
    Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
    Message msg = new Message();
    //另一种方式:Message msg = Messge.obtain;
    msg.obj = result;
    ④主线程中的handler对象在子线程中将message发送给主线程
    handler.sendMessage(msg);
    ⑤主线程中handlermessage方法接受子线程发来的数据,就可以做更新UI的操作。
    4、注意:子线程一定不能更新UI?
    ①SurfaceView :多媒体视频播放,可以在子线程中更新UI;
    ②Progress(进度)相关的控件:也是可以在子线程中更新Ui;

  • 相关阅读:
    青岛地铁交通咨询系统
    公共数据 | CnOpenData中国90座城市建筑物屋顶矢量数据集
    消息队列面试题
    K-优字符串(冬季每日一题 11)
    ESP8266-Arduino编程实例-开发环境搭建(基于PlatformIO)
    超越边界:如何ChatGPT 3.5、GPT-4、DALL·E 3和Midjourney共同重塑创意产业
    基于Android的乐鲜生活APP设计与实现
    【AI视野·今日CV 计算机视觉论文速览 第268期】Mon, 16 Oct 2023
    如何将平板或手机作为电脑的外接显示器?
    OpenGL LUT滤镜算法解析
  • 原文地址:https://blog.csdn.net/jiong9412/article/details/126654494