首頁 > 軟體

Android內建的OkHttp用法介紹

2022-08-02 18:09:02

Okhttp 處理了很多網路疑難雜症,比如從很多常用的連線問題中自動恢復。如果你伺服器設定了多個IP地址,當一個IP地址連線失敗後Okhttp會自動嘗試下一個IP,從Android4.4版本後,系統內建了Okhttp,可見Okhttp功能的強大。

遠端依賴新增,okio作為Okhttp的IO元件,也是必須要引入的。

    api 'com.squareup.okhttp3:okhttp:3.12.13'
    api 'com.squareup.okio:okio:2.8.0'

1.非同步GET請求

 Request.Builder url = new Request.Builder().url("");
        url.method("GET", null);
        Request build = url.build();
        OkHttpClient okHttpClient = new OkHttpClient();
        Call call = okHttpClient.newCall(build);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
            }
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                String string = response.body().string();
            }
        });

其基本步驟就是建立OkhttpClient、Request、和Call,最後呼叫Call的enqueue方法,需要注意的是onResponse回撥並非在UI執行緒中,如果想要同步GET請求,則可以呼叫Call的execute方法。

2.非同步POST請求

Okhttp3的非同步POST請求和okhttp2的非同步POST請求有一些差別,就是沒有FormEncodingBuilder這個類,替代它的是功能強大的FormBody。

        RequestBody formBody = new FormBody.Builder()
                .add("ip", "59.108.54.37")
                .build();
        Request build = new Request.Builder()
                .url("")
                .post(formBody)
                .build();
        OkHttpClient okHttpClient = new OkHttpClient();
        Call call = okHttpClient.newCall(build);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
            }
            @Override
            public void onResponse(Call call, Response response) throws IOException {
            }
        });

這與非同步GET請求類似,只是多了FormBody來封裝請求引數,並傳遞給Request

3.非同步上傳檔案

上傳檔案本身也是一個POST請求,首先定義上傳的檔案型別。

    public static final MediaType MEDIA_TYPE_MARKDOWN = MediaType.parse("text/x-markdown; charset=utf-8");

在SD卡的根目錄建立一個檔案 ,裡面內容為OkHttp

        String filePath = "";
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            filePath = Environment.getExternalStorageDirectory().getAbsolutePath();
        } else {
            return;
        }
        File file = new File(filePath, "test.txt");
        Request build = new Request.Builder()
                .url("")
                .post(RequestBody.create(MEDIA_TYPE_MARKDOWN, file))
                .build();
        OkHttpClient okHttpClient = new OkHttpClient();
        okHttpClient.newCall(build).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
            }
            @Override
            public void onResponse(Call call, Response response) throws IOException {
            }
        });

如果想要改為同步上傳檔案,只要呼叫OkhttpClient.newCall(request).execute()就可以了,最終請求返回結構就是我們txt檔案中的內容。

4.非同步下載檔案

下載一張圖片,得到Respouse後流寫進我們指定的圖片檔案中,程式碼如下所示

  String url = "";
        Request request = new Request.Builder().url(url).build();
        OkHttpClient okHttpClient = new OkHttpClient();
        okHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
            }
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                InputStream inputStream = response.body().byteStream();
                FileOutputStream fileOutputStream = null;
                String filePath = "";
                try {
                    if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
                        filePath = Environment.getExternalStorageDirectory().getAbsolutePath();
                    } else {
                        filePath = getFilesDir().getAbsolutePath();
                    }
                    File file = new File(filePath, "test.jpg");
                    if (null != file) {
                        fileOutputStream = new FileOutputStream(file);
                        byte[] buffer = new byte[2048];
                        int len = 0;
                        while ((len = inputStream.read(buffer)) != -1) {
                            fileOutputStream.write(buffer, 0, len);
                        }
                        fileOutputStream.flush();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

5.非同步上傳Multipart檔案

 有時上傳檔案時,同時還需要上傳其他型別的欄位。 Okhttp3 實現起來很簡單。 需要注意的是沒有伺服器接受我這個Multipart檔案,具體應用還要結合實際工作中對應的伺服器
   private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");
    public static void send() {
        OkHttpClient okHttpClient = new OkHttpClient();
        MultipartBody build = new MultipartBody.Builder()
                .setType(MultipartBody.FORM)
                .addFormDataPart("title", "test") //1
                .addFormDataPart("image", "test.jpg", RequestBody.create(MEDIA_TYPE_PNG, new File("/sdcard/test.jpg")))//2
                .build();
        Request authorization = new Request.Builder()
                .header("Authorization", "Client-ID" + "...")
                .url("")
                .post(build)
                .build();
        okHttpClient.newCall(authorization).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
            }
            @Override
            public void onResponse(Call call, Response response) throws IOException {
            }
        });
    }

上述程式碼中,註釋1處是常見的 key-value(鍵-值)形式的引數。

註釋2處則是上傳表單,addFormDataPart方法的第一個引數是key值,第二個引數是上傳檔案的名字,第三個引數是需要上傳的檔案。

6.設定超時時間和快取

和Okhttp2有區別的是Okhttp3不能通過OkhttpClient直接設定超時時間和快取了,而是通過OkHttpClient.Builder來設定。通過OkHttpClient.Builder設定好OkHttpClient後用builder.build()返回OkHttpClient。我們通常不會呼叫 new OkhttpClient() 來得到OkhttpClient,而是通過builder.build()得到OkHttpClient。另外OkHttp3支援設定連線,寫入和讀取超時時間。

        File sdcache = new File("");
        int cacheSize = 10 * 1024 * 1024;
        OkHttpClient.Builder builder = new OkHttpClient.Builder()
                .connectTimeout(15, TimeUnit.SECONDS)
                .writeTimeout(20, TimeUnit.SECONDS)
                .readTimeout(20, TimeUnit.SECONDS)
                .cache(new Cache(sdcache.getAbsoluteFile(),cacheSize));
        OkHttpClient okHttpClient = builder.build();

到此這篇關於Android內建的OkHttp用法介紹的文章就介紹到這了,更多相關Android OkHttp內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com