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


    【 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;

  • 相关阅读:
    AD域渗透总结
    CTF
    ew做代理 进一步内网渗透
    CVE-2019-0708复现
    win 内网frp反弹到内网liunx
    Liunx反弹shell的几种方式
    sql到python正则
    PHP面向对象学习-属性 类常量 类的自动加载 构造函数和析构函数 访问控制(可见性)
    PHP反序列化学习
    PHP面向对象学习
  • 原文地址:https://www.cnblogs.com/cangsir/p/5763022.html
Copyright © 2020-2023  润新知