Android內(nèi)置的OkHttp用法介紹
Okhttp 處理了很多網(wǎng)絡(luò)疑難雜癥,比如從很多常用的連接問題中自動(dòng)恢復(fù)。如果你服務(wù)器配置了多個(gè)IP地址,當(dāng)一個(gè)IP地址連接失敗后Okhttp會(huì)自動(dòng)嘗試下一個(gè)IP,從Android4.4版本后,系統(tǒng)內(nèi)置了Okhttp,可見Okhttp功能的強(qiáng)大。
遠(yuǎn)程依賴添加,okio作為Okhttp的IO組件,也是必須要引入的。
api 'com.squareup.okhttp3:okhttp:3.12.13'
api 'com.squareup.okio:okio:2.8.0'
1.異步GET請(qǐng)求
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(); } });
其基本步驟就是創(chuàng)建OkhttpClient、Request、和Call,最后調(diào)用Call的enqueue方法,需要注意的是onResponse回調(diào)并非在UI線程中,如果想要同步GET請(qǐng)求,則可以調(diào)用Call的execute方法。
2.異步POST請(qǐng)求
Okhttp3的異步POST請(qǐng)求和okhttp2的異步POST請(qǐng)求有一些差別,就是沒有FormEncodingBuilder這個(gè)類,替代它的是功能強(qiáng)大的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請(qǐng)求類似,只是多了FormBody來封裝請(qǐng)求參數(shù),并傳遞給Request
3.異步上傳文件
上傳文件本身也是一個(gè)POST請(qǐng)求,首先定義上傳的文件類型。
public static final MediaType MEDIA_TYPE_MARKDOWN = MediaType.parse("text/x-markdown; charset=utf-8");
在SD卡的根目錄創(chuàng)建一個(gè)文件 ,里面內(nèi)容為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 { } });
如果想要改為同步上傳文件,只要調(diào)用OkhttpClient.newCall(request).execute()就可以了,最終請(qǐng)求返回結(jié)構(gòu)就是我們txt文件中的內(nèi)容。
4.異步下載文件
下載一張圖片,得到Respouse后流寫進(jìn)我們指定的圖片文件中,代碼如下所示
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文件
有時(shí)上傳文件時(shí),同時(shí)還需要上傳其他類型的字段。 Okhttp3 實(shí)現(xiàn)起來很簡(jiǎn)單。 需要注意的是沒有服務(wù)器接受我這個(gè)Multipart文件,具體應(yīng)用還要結(jié)合實(shí)際工作中對(duì)應(yīng)的服務(wù)器
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(鍵-值)形式的參數(shù)。
注釋2處則是上傳表單,addFormDataPart方法的第一個(gè)參數(shù)是key值,第二個(gè)參數(shù)是上傳文件的名字,第三個(gè)參數(shù)是需要上傳的文件。
6.設(shè)置超時(shí)時(shí)間和緩存
和Okhttp2有區(qū)別的是Okhttp3不能通過OkhttpClient直接設(shè)置超時(shí)時(shí)間和緩存了,而是通過OkHttpClient.Builder來設(shè)置。通過OkHttpClient.Builder配置好OkHttpClient后用builder.build()返回OkHttpClient。我們通常不會(huì)調(diào)用 new OkhttpClient() 來得到OkhttpClient,而是通過builder.build()得到OkHttpClient。另外OkHttp3支持設(shè)置連接,寫入和讀取超時(shí)時(shí)間。
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();
到此這篇關(guān)于Android內(nèi)置的OkHttp用法介紹的文章就介紹到這了,更多相關(guān)Android OkHttp內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在Android項(xiàng)目中使用AspectJ的方法
這篇文章主要介紹了在Android項(xiàng)目中使用AspectJ的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04Android多設(shè)備多module打包fat-aar(最新推薦)
這篇文章主要介紹了Android多設(shè)備多module打包(fat-aar),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03Android手機(jī)內(nèi)存中文件的讀寫方法小結(jié)
這篇文章主要介紹了Android手機(jī)內(nèi)存中文件的讀寫方法,實(shí)例總結(jié)了Android針對(duì)文件讀寫操作的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04Android 加載大圖、多圖和LruCache緩存詳細(xì)介紹
這篇文章主要介紹了Android 加載大圖、多圖和LruCache緩存詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下2016-10-10Android延遲實(shí)現(xiàn)的幾種解決方法及原理分析
這篇文章主要給大家介紹了關(guān)于Android延遲實(shí)現(xiàn)的幾種解決方法以及其中的原理分析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12Android自定義ImageView實(shí)現(xiàn)自動(dòng)放大縮小動(dòng)畫
這篇文章主要為大家詳細(xì)介紹了Android自定義ImageView實(shí)現(xiàn)自動(dòng)放大縮小動(dòng)畫,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06Android 模擬器(emulator-5554...)出現(xiàn)錯(cuò)誤解決辦法
這篇文章主要介紹了Android 模擬器出現(xiàn)錯(cuò)誤解決辦法的相關(guān)資料,如:Unable to get view server version from device,F(xiàn)ailed to install helloworld.apk on device 'emulator-5554': timeout,這種常見錯(cuò)誤,解決辦法,需要的朋友可以參考下2016-11-11Fragment跳轉(zhuǎn)時(shí)傳遞參數(shù)及結(jié)果回傳的方法(推薦)
今天總結(jié)一下Fragment間的參數(shù)傳遞及結(jié)果返回的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下2017-01-01Android自定義View實(shí)現(xiàn)柱狀波形圖的繪制
柱狀波形圖是一種常見的圖形。一個(gè)個(gè)柱子按順序排列,構(gòu)成一個(gè)波形圖。本文將利用Android自定義View實(shí)現(xiàn)柱狀波形圖的繪制,需要的可以參考一下2022-08-08