OKHttp使用詳細およびソースコード解析


前言


前のブログでは、OKHttpのパッケージであるRetrofitの使用について知りました.Retrofit 2の内部実装はOKHttp 3です.以下、OKHttp 3の使用について知ります.

使用


①まず依存をインポートします.最新バージョンは3.4.1です.gradleでは:
compile 'com.squareup.okhttp3:okhttp:3.4.1'

OKHttp内部はOkioライブラリに依存するため、Okioライブラリも追加します.最新バージョンは1.9.0です.
compile 'com.squareup.okio:okio:1.9.0'

②HTTPリクエストGETリクエスト送信
// OKHttpClient 
OkHttpClient okHttpClient=new OkHttpClient();
// Request 
Request request=new Request.Builder()
                .url("http://api.36wu.com/Weather/GetWeather?district=%E5%8C%97%E4%BA%AC")
                .build();
//OkhttpClient#newCall() Call 
Call call=okHttpClient.newCall(request);
//Call#enqueue() 
call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.e("fail",e.toString());
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException{
                Log.e("success",response.body().toString());
            }
        });
    }

上の注釈はもうはっきりしているので、ここでは説明しません.ここで注意すべき点は、onResponseコールバックのパラメータはresponseであり、一般的には、例えば、戻りたい文字列はresponse.body().string()で取得することができる.返されるバイナリバイト配列を取得する場合は、response.body().bytes()が呼び出される.戻るinputStreamを取得したい場合は、response.body().byteStream()POSTリクエストを呼び出します.
OkHttpClient okHttpClient=new OkHttpClient();
// RequestBody , add() 
RequestBody body=new FormBody.Builder()
    .add("district","%E5%8C%97%E4%BA%AC")
    .build();
// Request , post , RequestBody 
Request request=new Request.Builder()
    .url("http://api.36wu.com/Weather/GetWeather")
    .post(body)
    .build();
Call call=okHttpClient.newCall(request);
call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.e("fail",e.toString());
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Log.e("success",response.body().toString());
            }
        });
    }

ここで注意すべき点は、OKHttp 3でRequestBodyオブジェクトを構築する際に、以前のFormBodyの代わりにFormEncodingBuilderが使用されていることです.ここで注意してください.③ファイルアップロードファイルアップロード、RequestBody構築時:
OkHttpClient okHttpClient=new OkHttpClient();
File file = new File(Environment.getExternalStorageDirectory(), "test.txt");
RequestBody body = RequestBody.create(MediaType.parse("application/octet-stream"), file);
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addPart(Header ,body)
//.addFormDataPart("XXX","XXX",body)
.build();
Request request = new Request.Builder()
    .url("XXXX")
    .post(requestBody)
    .build();

Call call = okHttpClient.newCall(request);
call.enqueue(new Callback(){ });

ここで注意しなければならない問題の一つは、OKHttp 3でファイルアップロードに使用されるMultipartBodyが、以前のMultipartBuilderに代わって、使い方も少し違いますので、注意してください.

パッヶージ


鴻洋大神のOKHttpのパッケージを参考にしてください.
Android OkHttp完全解析はOkHttpを理解する時だhttp://blog.csdn.net/lmj623565791/article/details/47911083Androidの改善されたokHttpパッケージライブラリhttp://blog.csdn.net/lmj623565791/article/details/49734867

ソース分析


概要、多重接続プール、キャッシュポリシー、DiskLruCache、タスクキューの5つの部分を含む、一連のブログを簡単に見ました.
  • OkHttp 3ソースコード分析[概要]
  • OkHttp 3ソースコード分析[多重接続プール]
  • OkHttp 3ソースコード分析[キャッシュポリシー]
  • OkHttp 3ソースコード分析[DiskLruCache]
  • OkHttp 3ソース分析[タスクキュー]
  • 时间があって更に详しくソースを読みます!!!