zoukankan      html  css  js  c++  java
  • Android 开源框架 ( 一 ) OkHttp 网络框架的基本使用

           HttpClient  和 HttpURLConnection 以及 OkHttp :

      在Android 2.2版本之前,HttpClient拥有较少的bug,因此使用它是最好的选择。
            而在Android2.3版本及以后,HttpURLConnection则是最佳的选择。它的API简单,体积较小,因而非常适用于Android项目。压缩和缓存机制可以有效地减少网络访问的流量,在提升速度和省电方面也起到了较大的作用。对于新的应用程序应该更加偏向于使用HttpURLConnection,因为在以后的工作当中我们也会将更多的时间放在优化HttpURLConnection上面。

            其实现在嘛,两者都不用,就用Okhttp. HttpUrlConnection现在的底层实现就是通过Okhttp.

    一. HttpUrlConnect 介绍

      1. 网络通信首先需要配置网络请求权限:

    <uses-permission android:name="android.permission.INTERNET" />

      2.使用如下方式实现子线程里http请求通信: 

      开启线程两种常用的实现方式:一种是继承Thread类.一种是实现Runnable接口.

    new Thread(new Runnable() {
    
                @Override
                public void run() {
                    ...
                    //子线程方法异步执行
                    ...
                }
            }).start();

      如果在主线程(也就是我们常说的UI线程)中进行Http请求,会报如下错.(NetworkOnMainThreadException)

    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.okhttp.okhttp/com.android.okhttp.okhttp.MainActivity}: android.os.NetworkOnMainThreadException
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2855)

      3.使用HttpUrlConnect实现异步http get请求获取网络数据示例:

    // 1. 得到访问地址的URL
                URL url = new URL(urlStr);
                // 2. 得到网络访问对象java.net.HttpURLConnection
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                /* 3. 设置请求参数(过期时间,输入、输出流、访问方式),以流的形式进行连接 */
                // 设置是否向HttpURLConnection输出
                connection.setDoOutput(false);
                // 设置是否从httpUrlConnection读入
                connection.setDoInput(true);
                // 设置请求方式
                connection.setRequestMethod("GET");
                // 设置是否使用缓存
                connection.setUseCaches(true);
                // 设置此 HttpURLConnection 实例是否应该自动执行 HTTP 重定向
                connection.setInstanceFollowRedirects(true);
                // 设置超时时间
                connection.setConnectTimeout(3000);
                // 连接
                connection.connect();
                // 4. 得到响应状态码的返回值 responseCode
                int code = connection.getResponseCode();
                // 5. 如果返回值正常,数据在网络中是以流的形式得到服务端返回的数据
                String msg = "";
                if (code == 200) { // 正常响应
                    // 从流中读取响应信息
                    BufferedReader reader = new BufferedReader(
                            new InputStreamReader(connection.getInputStream()));
                    String line = null;
                    
                    // 循环从流中读取
                    while ((line = reader.readLine()) != null) {
                        msg += line + "
    ";
                    }
                    reader.close(); // 关闭流
                }
                // 6. 断开连接,释放资源
                connection.disconnect();
    
                // 显示响应结果
                Log.i("getDataByHttpUrlConnect",msg);
                //组装消息
                Message message = new Message();
                message.what = RESPONSE_OK;
                message.obj = msg;
                //发送消息
                handler.sendMessage(message);

        4.在子线程进行网络请求后,将返回的信息在主线程控件上刷新显示. 使用到Handler操作.

      //定义一个Handler来接收子线程发送的消息并处理:
                Handler handler = new Handler(new Handler.Callback() {
                    @Override
                    public boolean handleMessage(Message message) {
                        switch (message.what){
                            case RESPONSE_OK:
                                //将返回的消息打印在界面TextView控件上显示
                                tv_response.setText(message.obj.toString());
                                break;
                        }
                        return true;
                    }
                });

    二. OkHttp 介绍

      Requests 和 Responses 两个属性概念解释:

        Requests(请求) 每一个HTTP请求中都应该包含一个URL,一个GET或POST方法以及Header或其他参数,当然还可以含特定内容类型的数据流。
            注意下Content-Type:
              RequestBody的数据格式都要指定Content-Type,常见的有三种:
              application/x-www-form-urlencoded 数据是个普通表单
              multipart/form-data 数据里有文件
              application/json 数据是个json

        Responses(响应) 响应则包含一个回复代码(200代表成功,404代表未找到等灯),Header和定制可选的body。

      1.项目中配置使用OkHttp  

      首先gradle 引入类库(AndroidStudio显示最新的是3.11.0版本-2018年7月28日):

    implementation 'com.squareup.okhttp3:okhttp:3.11.0'    

      或者下载jar包:
        OkHttp官网地址:http://square.github.io/okhttp/
        OkHttp GitHub地址:https://github.com/square/okhttp

      2. OkHttp get请求示例:

          //new OkHttpClient
                OkHttpClient okHttpClient = new OkHttpClient();
                    //封装Request请求信息,get方式,请求url
                    Request request = new Request.Builder().get().url(urlStr).build();
                    //定义一个接受返回信息的Response
                    Response response = null;
                    try {
                        //调用OkHttp内部真正的实现请求,并返回请求结果Response
                        response = okHttpClient.newCall(request).execute();
                        if(response.isSuccessful()){
                            //请求回来不能再子线程里进行界面Ui更新操作,通过Handler来通知主线程界面刷新
                            Message message = new Message();
                            message.what = RESPONSE_OK;
                            message.obj = response.body().toString();
                            handler.sendMessage(message);
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
  • 相关阅读:
    Android Handler与多线程
    在Eclipse发展Webapp部署过程,缓存的位置
    虚拟仿真引擎消息机制
    OpenGL+VS2013+WIN7(64)组态
    注解
    ios背景更新和下载
    uva 11529
    ATMEGA16 IOport相关汇总
    【剑指offer】Q32:从1至n整1出现的次数(python)
    Android NDK进入发展
  • 原文地址:https://www.cnblogs.com/bugzone/p/rxjava_get.html
Copyright © 2011-2022 走看看