zoukankan      html  css  js  c++  java
  • 【Android

      OkHttp是一个非常优秀的网络访问框架,当下非常火的Retrofit的底层就是使用OkHttp进行封装的。接下来介绍以下OkHttp的简单使用。

    1、导入依赖

      在Android Studio中,在Module的build.gradle文件中导入以下依赖:

        compile 'com.squareup.okhttp3:okhttp:3.4.2'
        compile 'com.squareup.okio:okio:1.11.0'

    2、代码编写

    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.widget.TextView;
    
    import org.json.JSONException;
    import org.json.JSONObject;
    
    import java.io.IOException;
    
    import okhttp3.Call;
    import okhttp3.Callback;
    import okhttp3.FormBody;
    import okhttp3.OkHttpClient;
    import okhttp3.Request;
    import okhttp3.Response;
    
    public class MainActivity extends AppCompatActivity {
        private static final String URL = "https://api.github.com/users/basil2style";
    
        private TextView tv;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            tv = (TextView) findViewById(R.id.tv);
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            // okhttGet();
            okhttpPost();
        }
    
        /**
         * GET请求
         */
        private void okhttGet() {
            // 创建OkHttpCliend对象
            OkHttpClient client = new OkHttpClient();
            // 创建一个Request
            Request request = new Request.Builder()
                    .url(URL)
                    .build();
            // call
            Call call = client.newCall(request);
            // 请求加入调度(异步)
            call.enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    // 请求失败时回调的方法
                }
    
                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    // 请求成功时回调的方法
                    final String result = response.body().string();
                    // 在主线程中更新UI
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            setTextToTextView(result);
                        }
                    });
                }
            });
        }
    
        /**
         * POST请求
         */
        private void okhttpPost() {
            OkHttpClient client = new OkHttpClient();
            // FormBody.Builder builder = new FormBody.Builder();
            // builder.add("username", "ITGungnir");
            Request request = new Request.Builder()
                    .url(URL)
                    // .post(builder.build())
                    .build();
            Call call = client.newCall(request);
            call.enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    // 请求失败时回调的方法
                }
    
                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    // 请求成功时回调的方法
                    final String result = response.body().string();
                    // 在主线程中更新UI
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            setTextToTextView(result);
                        }
                    });
                }
            });
        }
    
        /**
         * 通过返回结果获取要展示在TextView中的文本信息
         */
        private void setTextToTextView(String data) {
            try {
                JSONObject parent = new JSONObject(data);
                StringBuffer sb = new StringBuffer();
                sb.append("type: " + parent.getString("type") + "
    ");
                sb.append("id: " + parent.getInt("id") + "
    ");
                sb.append("name: " + parent.getString("name") + "
    ");
                sb.append("location: " + parent.getString("location") + "
    ");
                sb.append("blog: " + parent.getString("blog") + "
    ");
                sb.append("email: " + parent.getString("email"));
                tv.setText(sb.toString());
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }

    3、OkHttp原理

                

    (1)当创建同步请求或异步请求时,如果此时拦截器链(请求队列)中没有请求,则直接进行网络请求;如果此时请求队列中已经有请求,则将请求添加到请求队列中。请求队列负责调度请求,将请求一个一个取出进行处理。

    (2)HttpEngine负责发起请求,发起请求后先去缓存中查找有没有缓存,如果有,则直接从缓存中取出数据;如果缓存中没有,则开始准备从网络获取数据。

    (3)OkHttp内部维护了一个网络连接池ConnectionPool,维护了一些网络请求,保证网络请求的循环利用。

    (4)从ConnectionPool中取出一个请求对象,访问网络,获取访问结果Response并进行处理。

    4、OkHttp封装

    以下是鸿洋大神封装的一个OkHttp操作工具框架,其封装了:

    • 一般的get请求
    • 一般的post请求
    • 基于Http Post的文件上传(类似表单)
    • 文件下载/加载图片
    • 上传下载的进度回调
    • 支持取消某个请求
    • 支持自定义Callback
    • 支持HEAD、DELETE、PATCH、PUT
    • 支持session的保持
    • 支持自签名网站https的访问,提供方法设置下证书就行

    详情请访问GitHub地址:【OkHttp-Utils】

  • 相关阅读:
    PHP计算近1年的所有月份
    mysql的索引和锁
    深度解析 https 协议
    linux 常用命令大全
    为什么Python3.6字典变得有序了?
    oddo
    RESTful接口开发规范
    python中的 __inti__ 和 __new__ 方法的区别
    十大经典算法 Python实现
    MongoDB journal 与 oplog,究竟谁先写入?--转载
  • 原文地址:https://www.cnblogs.com/itgungnir/p/6210981.html
Copyright © 2011-2022 走看看