中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android開發之OkHttp3.4.x

發布時間:2020-06-27 04:00:13 來源:網絡 閱讀:915 作者:墨宇hz 欄目:移動開發

HTTP是現代應用程序訪問網絡的一種方式。網絡中很多請求就是使用的http方式,來訪問網絡的。

Android從4.4開始,HttpUrlConnection開始使用okhttp作為底層實現。實現原理如下圖:

Android開發之OkHttp3.4.x

這篇博客簡單說一下okhttp的使用。文字部分沒有講清楚的,可以查看代碼里面的注釋。首先看一下okHttp怎么工作的。

首先我們看看一個okhttp完整的網絡訪問,都涉及到了那幾個類(這里先說核心類)。

1.OkHttpClient: Call類的工廠,Call是用來發送網絡請求和接收服務器響應的類。這個類實例可以設置攔截器,緩存大小,緩存目錄,連接池等信息。

2.Request:是用來創建http請求,這個請求里面可以設置請求頭信息,網絡訪問地址,請求方式(GET,POST,DELETE,PUT)等。

3.Call:一個接口,一個準備執行的請求。

具體代碼:

/**
         * 首先構建OkHttpClient,<br />
         * 1. 方法:直接使用new 關鍵字創建
         * 2. 方法:使用構造著模式,OkHttpClient.Builder.build方法構造。
         * 這個類是用來配置和創建HTTP 連接。在大多數的程序中,這個類可以封裝成一個單利模式
         * 來進行程序網絡訪問的統一管理。
         * 設置 共享的響應緩存、線程池、連接復用
         * (要設置這些東西,請使用官方提供的方法,OkHttpClient.Builder來設置緩存目錄、緩存大小,
         * 配置連接池,
         * 配置攔截器,
         * )
         *然后構建Request請求對象<br />
         * request對象只能使用Request.Builder.build來創建對象。
         * 最后Call,使用httpClient.newCall(request)來生成一個執行對象。
         * 用call對象,調用execute方法,執行網絡請求
         * */
        File file = new File(Environment.getDataDirectory().getAbsolutePath()+File.pathSeparator+"http_cache");
        final Cache cache = new Cache(file, 20000);
        //最大的閑置連接數量,
        ConnectionPool pool = new ConnectionPool(10, 5, TimeUnit.SECONDS);

        //call的工廠類,Call是用來發送請求和接收響應的類
        OkHttpClient httpClient = new OkHttpClient.Builder().addInterceptor(new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                //請求時的參數
                Response response = chain.proceed(chain.request());

                okhttp3.MediaType mediaType = response.body().contentType();
//                響應體
                String content = response.body().string();
                return response.newBuilder()
                        .body(okhttp3.ResponseBody.create(mediaType, content))
                        .build();
            }
//           這只連接池,緩存
        }).connectionPool(pool).cache(cache).build();

        //這里面來設置網絡訪問的頭信息,以及訪問的網絡地址,這里默認使用get方式請求
        Request request = new Request.Builder().url("https://www.baidu.com").build();
        Call call = httpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.d("--MainActivity--", "onFailure: ---網絡訪問失敗");
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
//                這個方法在網絡訪問成功之后回執行。response響應體,實例里封裝了服務器返回的數據。
//                最常用的就是body(),服務器返回的數據(ResponseBody)。這個ResponseBody里面是服務器具體返回的數據
//                如果是返回的字符串則用string()方法。如果是流, 則byteStream(),字節數組bytes().
                Log.d("--MainActivity--", "onResponse: "+response.body().string());
            }
        });

這樣一個完整的網絡訪問就完成了。

使用到得權限:

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

注:okhttp源碼:https://github.com/square/okhttp

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

沙洋县| 牡丹江市| 皮山县| 平果县| 安庆市| 崇阳县| 城口县| 新营市| 丰县| 宜川县| 哈密市| 舞钢市| 富源县| 天长市| 辽宁省| 基隆市| 林州市| 长阳| 得荣县| 尼勒克县| 柳江县| 赫章县| 贵南县| 榆树市| 浏阳市| 泌阳县| 万源市| 闻喜县| 泰兴市| 双牌县| 合山市| 壤塘县| 泸定县| 旺苍县| 无为县| 宁化县| 茌平县| 军事| 凤山县| 康保县| 灵丘县|