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

原文地址:https://www.cnblogs.com/itgungnir/p/6210981.html