您好,登錄后才能下訂單哦!
簡述
還是先來說說為啥用OkHttp作為多圖片上傳的框架,原因有兩點:
1、OkHttp可以作為Volley底層傳輸協議,速度更快
2、使用Xutils和KJFramework上傳圖片存在一個小問題,首先,可以上傳,并且可以上傳多張圖片,也可以上傳其他的參數,那問題在哪里呢?在后臺接受參數時很不靈活,Xutlis及KJFramework使用HashMap來上傳每個參數,每一張圖片也必須有一個唯一的key,上傳一張圖片就要定義一個參數來接收,上傳兩張圖片就要定義兩個參數來接收,當上傳的圖片數量不確定的時候,如最多9張或者16張,后臺接受圖片的時候就要定義9個或者16個,這樣的方式很不利于擴展,最好是一個參數接收所有所有圖片,不會因為這種不確定的問題,就去定義很多的參數,然后一個個判斷是否存在。OkHttp底層則不是這樣,大概的瀏覽了下源碼,底層接收參數的時候使用的是List,只要使用相同的key就可以添加到同一個list,而后臺只需要根據這一個key不斷遍歷就行,無論多少張圖片都無障礙,也沒有了后顧之憂。
核心代碼實現
//參數類型 private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png"); //創建OkHttpClient實例 private final OkHttpClient client = new OkHttpClient(); MultipartBuilder builder = new MultipartBuilder().type(MultipartBuilder.FORM); //遍歷map中所有參數到builder for (String key : map.keySet()) { builder.addFormDataPart(key, map.get(key)); } //遍歷paths中所有圖片絕對路徑到builder,并約定key如“upload”作為后臺接受多張圖片的key for (String path : paths) { builder.addFormDataPart("upload", null, RequestBody.create(MEDIA_TYPE_PNG, new File(path))); } //構建請求體 RequestBody requestBody = builder.build(); //構建請求 Request request = new Request.Builder() .url(url)//地址 .post(requestBody)//添加請求體 .build(); //發送異步請求,同步會報錯,Android4.0以后禁止在主線程中進行耗時操作 client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Request request, IOException e) { System.out.println("request = " + request.urlString()); System.out.println("e.getLocalizedMessage() = " + e.getLocalizedMessage()); } @Override public void onResponse(Response response) throws IOException { //看清楚是response.body().string()不是response.body().toString() System.out.println("response = " + response.body().string()); } });
基本實現思路就是這樣了,更多請參考OkHttp文檔,項目中我準備完全除去Xutils的其他部分,如文件下載部分。
知識拓展
List與HashMap區別
List可以保存多個相同或者不同的元素
HashMap則是以鍵值對(key-value)保存元素,當添加多個相同key的元素,之前的元素會被覆蓋
這一點至關重要,Xutils以及KJFframework的設計都沒有考慮到這一點,看似很好用,但當我要添加多張相同或者不同的圖片文件作為參數傳輸給后臺,我卻需要定義很多的key,不然無論添加多少張圖片結果卻只能是最后一張。
總結
以上所述是小編給大家介紹的android 使用OkHttp上傳多張圖片的實現代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對億速云網站的支持!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。