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

  • 相关阅读:
    1035 Password
    .NET 7 来了!!!
    电磁兼容——电子系统的EMC要求
    java计算机毕业设计ssm重点实验室系统
    快速幂矩阵-python
    R语言使用glm函数构建泊松对数线性回归模型处理三维列联表数据构建饱和模型、使用step函数基于AIC指标实现逐步回归筛选最佳模型、解读分析模型
    Windows系统安装Redis
    业务系统架构实践总结
    【操作系统】文件管理大题总结
    MATLAB中线性方程组计算
  • 原文地址:https://blog.csdn.net/jiong9412/article/details/126654494