<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
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'
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方法。
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
上傳檔案本身也是一個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檔案中的內容。
下載一張圖片,得到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(); } } });
有時上傳檔案時,同時還需要上傳其他型別的欄位。 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值,第二個引數是上傳檔案的名字,第三個引數是需要上傳的檔案。
和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!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45