Android OkHttpの詳細

17872 ワード

Android OkHttpの詳細
効果図
GET要求POST要求
OkHttp
まず、OkHttpというフレームワークはSquare社が発売したもので、公式サイトに入ります.APIを見たい場合は、クリックしてAPIに入ります.OkHttpを理解した後、OkHttpはAndroid開発を学ぶときに接触するHttpURLConnectionとApacheが提供するHttpClientの2つのクラスであり、その後、サードパーティのネットワークフレームワークであることを知っておく必要があります.
コンセプト:OkHttpはHttpURLConnectionを置き換えるためのもので、android 4.4ソースコードのHttpURLConnectionをOkHttpに置き換えました.だからOkHttpはこれらのネットワークフレームワークと比べて、これらのネットワークフレームワークもHttpURLConnectionに基づいていくつかのパッケージを行うだけで、私たちのコードをもっと簡潔で便利にします.okhttpは、対応するokhttp-apacheモジュールを提供しています.
HttpURLConnectionとOkHttpの比較利点1.HttpURLConnectionにあるAPI、OkHttpは基本的に2.HttpURLConnectionとOkHttpはいずれもHttpsをサポートし、ストリームのアップロードとダウンロード、タイムアウト、IP 6、接続プールなど3.OkHttpは、HttpURLConnectionよりも同期非同期要求、キャッシュメカニズムが優れており、HttpDNS、リダイレクト、Gzip圧縮、プラットフォーム適応性、サーバIPの変換、直接Socket通信、ブロッキングなどをサポートしています.欠点1.OkHttpは優先度要求2をサポートしない.OkHttpは自己署名証明書3をサポートしていない.OkHttp headerでは中国語が伝わらない
okHttp、volley、android-async-http比較:volleyは単純な非同期httpライブラリであり、それだけです.欠点は同期をサポートしないことであり、開発モデルを制限する.大きなデータをpostできないので、android-async-httpをアップロードするのに適していません.volleyと同様に非同期ネットワークライブラリですが、volleyはパッケージのhttpUrlConnectionであり、パッケージのhttpClientですが、androidプラットフォームはHttpClientを推奨していないので、このライブラリはandroidプラットフォームには適していません.okhttpは高性能のhttpライブラリで、同期、非同期をサポートし、spdy、http 2、websocketプロトコルを実現し、apiは簡潔で使いやすく、volleyと同様にhttpプロトコルのキャッシュを実現しています.OK Http紹介:公式サイトアドレス:クリックしてリンク公式APIアドレスを開く:クリックしてリンクgithubソースアドレスを開く:クリックしてリンクを開くokHttp主要クラス:1.OkHttpClient.java2.Request.java3.Call.java4.RequestBody.java5.Response.java
コードデモ
レイアウトファイルactivity_mainは、レイアウトファイルに2つのButtonを追加してGET POSTクリックイベントで異なることをし、ImageViewはGET要求表示ピクチャに使用する
xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.chenxiaoyang.okhttp.MainActivity">
    <Button
        android:text="Get  "
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:id="@+id/button"/>
    <Button
        android:text="Post  "
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/button"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:id="@+id/button2"/>
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"
        android:id="@+id/imageView"/>
RelativeLayout>

まずButtonのクリックイベントにswitchを追加してButtonのクリックで違うことをします
1.GETリクエスト:ここでButtonクリックイベントを使用してImageViewに画像をロードします
まずは最初のButtonで
//   :   okHttpClient  
                OkHttpClient okHttpClient = new OkHttpClient();
                //   :      ,  ,   。    
                final Request request = new Request.Builder()
                        //      ,     Get  .method()
//                        .method("GET",null)
                        .get()
                        .url("http://v1.qzone.cc/pic/201303/18/19/13/5146f6cf48042546.jpg!600x600.jpg")
                        .build();
                //   :   Call  
                Call call = okHttpClient.newCall(request);
                //   :    Get  
                call.enqueue(new Callback() {
                    //          
                    @Override
                    public void onFailure(Call call, IOException e) {
                        //  UI        ,    Handle  
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                Toast.makeText(MainActivity.this, "    ", Toast.LENGTH_SHORT).show();
                            }
                        });
                    }

                    //          
                    @Override
                    public void onResponse(Call call, Response response) throws IOException {
                        //            ,      UI
                        //      body   
                        //      
                        InputStream inputStream = response.body().byteStream();
                        //  BitmapFactory    ,  decodeStream              
                        Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
                        Message message = Message.obtain();
                        message.what = 0;
                        message.obj = bitmap;
                        mHandler.sendMessage(message);

                    }
                });

2.POST要求:ここで私はButtonを使ってイベントをクリックしてToastを使ってデータを表示する
2番目のButton
//   ,   OkHttpClient  
OkHttpClient okHttpClient1 = new OkHttpClient();
//   ,    
RequestBody requestBody = new FormBody.Builder()
        .add("league", "  ")
        .add("key", "7121c58a9280b7d98ca041949fd579f2")
        .build();
Request request1 = new Request.Builder()
        .url("http://op.juhe.cn/onebox/football/league")
        .post(requestBody)
        .build();
//   Call  
Call call1 = okHttpClient1.newCall(request1);
//    GET  
call1.enqueue(new Callback() {
    //          
    @Override
    public void onFailure(Call call, IOException e) {
        // runOnUiThread         UI  
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(MainActivity.this, "    ", Toast.LENGTH_SHORT).show();
            }
        });
    }

    //          
    @Override
    public void onResponse(Call call, Response response) throws IOException {
        //             
        String string = response.body().string();
        Message message = Message.obtain();
        message.what=1;
        message.obj = string;
        mHandler.sendMessage(message);
    }
});

3.Handlerインスタンス化を追加し、Messageによって送信されたデータを受信する
private Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        if(msg.what==0){
            mImageView.setImageBitmap((Bitmap) msg.obj);
        }else if(msg.what==1){
            Toast.makeText(MainActivity.this, (String) msg.obj, Toast.LENGTH_SHORT).show();
        }
    }
};