day04_网络编程

来源:互联网 发布:守望先锋鼠标宏编程 编辑:程序博客网 时间:2024/06/15 04:55

通过网络从服务器获取数据

文本、图片

网络通信


1 网络图片查看器(重点)

  1. 写一个URL
  2. 打开http连接通道
  3. 设置请求参数
  4. 获取响应吗

    • 2xx 成功 3xx重定向 4xx客户端错误 5xx服务器错误
  5. 获取服务器返回的二进制输入流

  6. 添加网络权限

2 子线程不能修改UI界面

  • android.os.NetworkOnMainThreadException

    • 网络在主线程异常
    • google工程师为了保证界面流畅,在高版本的操作系统里,强制要求网络必须放在子线程中。
  • android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

    • 从错误线程调用的异常
    • 谁创建,谁修改
    • 只能在主线程中修改UI

3 消息处理机制的原理(重点)

  • 原理:如图

  • 编写步骤:

    1. 在activity中创建Handler
    2. 在子线程中用handler发消息
    3. 在handleMessage()方法中处理消息

4 网络源码查看器

/** * 1. 在子线程中发送网络 * 2. 获取网络返回的二进制输入流 * 3. 把流转化成字符串 * 4. 用handler,把字符串显示在textview上 */public void look(View v){    System.out.println("哥哥点击了按钮");    path = etPath.getText().toString().trim();    if (TextUtils.isEmpty(path) || !path.startsWith("http")) {        Toast.makeText(this, "哥哥,请输入正确的网址", 0).show();        return;    }    //开启子线程    new Thread(){        public void run() {            reqeustNetWork();        };    }.start();}/** * 请求网络 */protected void reqeustNetWork() {    try {        // 1. 写一个URL        URL url = new URL(path);        // 2. 打开http连接通道        HttpURLConnection conn = (HttpURLConnection) url.openConnection();        // 3. 设置请求参数        conn.setRequestMethod("GET");        conn.setConnectTimeout(3000);        // 4. 获取响应吗        // * 2xx 成功 3xx重定向 4xx客户端错误 5xx服务器错误        int code = conn.getResponseCode();        if (200 == code) {            // 5. 获取服务器返回的二进制输入流            InputStream is = conn.getInputStream();            //把流转化成字符串            String text = StringUtils.parsseStream2Str(is);            //发送消息            Message msg = Message.obtain();//从消息池中获取消息            msg.obj = text;            msg.what = MSG_SUCC;            mHandler.sendMessage(msg);        }else {            //响应吗不是200            //发送消息            Message msg = Message.obtain();//从消息池中获取消息            msg.obj = code;            msg.what = MSG_ERR_CODE;            mHandler.sendMessage(msg);        }    } catch (Exception e) {        e.printStackTrace();        //发送消息        mHandler.sendEmptyMessage(MSG_ERR);    }}Handler mHandler = new Handler(){    public void handleMessage(Message msg) {        switch (msg.what) {            case MSG_SUCC:                tvPage.setText((String)msg.obj);                break;            case MSG_ERR_CODE :                Toast.makeText(MainActivity.this, String.valueOf(msg.obj), 0).show();                break;            case MSG_ERR ://异常                Toast.makeText(MainActivity.this, "服务器忙!", 0).show();                break;            default:                break;        }    };};

5 消息处理常用的另一个API

    runOnUiThread(new Runnable() {        @Override        public void run() {            Toast.makeText(MainActivity.this, text, 0).show();        }    });

阶段总结


6 新闻客户端

  • 获取服务器的数据(子线程)

    1. 网络通讯

      1. 写一个URL
      2. 打开http连接通道
      3. 设置请求参数
      4. 获取响应吗

        • 2xx 成功 3xx重定向 4xx客户端错误 5xx服务器错误
      5. 获取服务器返回的二进制输入流

      6. 添加网络权限
    2. 解析Xml文件
      1. 创建Xml解析器
      2. 设置参数
      3. 解析文件
  • 显示新闻数据

    1. 用ListView展示

      1. 在Xml布局文件中写一个listview
      2. 在java代码中找到这个控件
      3. 设置数据适配器
      4. 用内部类写数据适配器
    2. 用Handler修改UI

      1. 在activity中创建Handler
      2. 在子线程中用handler发消息
      3. 在handleMessage()方法中处理消息
    3. 显示图片

  • 总结:

    cn.itcast.citynews
    cn.itcast.citynews.bean 数据实体JavaBean
    cn.itcast.citynews.net 网络通讯工具类
    cn.itcast.citynews.xml 解析Xml文件
    com.loopj.android.image 开源框架

使用开源框架


7 使用SmartImageView显示新闻图片(重点)

  • 应用场景:系统控件无法满足需求

    1. 在网络上下载开源框架github
    2. 阅读README或者sample实例代码
原创粉丝点击