国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Retrofit實現圖文上傳至服務器

2019-12-12 03:15:18
字體:
來源:轉載
供稿:網友

前言:現在大多數的項目中都涉及圖片+文字上傳了,下面請詳見實現原理:

開發環境:AndroidStudio

1.引入依賴:

compile 'com.squareup.retrofit2:retrofit:2.1.0'  

2.網絡權限:

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

3.創建上傳對象OkHttpClient :

private static final OkHttpClient client = new OkHttpClient.Builder()   .addInterceptor(new Interceptor() {    @Override    public Response intercept(Chain chain) throws IOException {     Request request = chain       .request()       .newBuilder()       .build();     return chain.proceed(request);    }   })   .readTimeout(10, TimeUnit.SECONDS)//設置讀取超時時間   .writeTimeout(10, TimeUnit.SECONDS)//設置寫的超時時間   .connectTimeout(15, TimeUnit.SECONDS)//設置連接超時時間   .build();

4.上傳圖片的公有方法:

private synchronized final static void uploadImgAndParameter(Map<String, Object> map, String url,   final UIDataListener listener) {  // mImgUrls為存放圖片的url集合  MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);  if (null != map) {   for (Map.Entry<String, Object> entry : map.entrySet()) {    if (entry.getValue() != null) {     if (entry.getValue() instanceof File) {      File f = (File) entry.getValue();      builder.addFormDataPart(entry.getKey(), f.getName(), RequestBody.create(MEDIA_TYPE_PNG, f));     } else {      builder.addFormDataPart(entry.getKey(), entry.getValue().toString());     }    }   }  }  //創建RequestBody  RequestBody body = builder.build();//  MultipartBody requestBody = builder.build();  //構建Request請求  final Request request = new Request.Builder()    .url(url)//地址    .post(body)//添加請求體//    .post(requestBody)//添加請求體    .build();  client.newCall(request).enqueue(new okhttp3.Callback() {   @Override   public void onResponse(Call call, final Response response) throws IOException {    if (response.isSuccessful()) {//判斷是否成功     final String data = response.body().string();//string()僅可調用一次。否則報IllegalStateException: closed異常     Log.i("file1", "上傳照片成功-->" + data);     onSuccess(listener, data);     call.cancel();//上傳成功取消請求釋放內存    }   }   @Override   public void onFailure(Call call, final IOException e) {    Log.i("file2", "上傳失敗-->" + e.getMessage());    String msg = e.getMessage();    if (msg == null || msg.equals("timeout")) {     onError(listener, "網絡不穩定請求超時!");    } else {     onError(listener, e.getMessage());    }    call.cancel();//上傳失敗取消請求釋放內存   }  }); }

//注意:添加手機圖片,別忘了添加SD卡權限

5.全部代碼:

public class HttpUtil {  private static final Handler handler = new Handler(Looper.getMainLooper());  private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/*");  private static final OkHttpClient client = new OkHttpClient.Builder()      .addInterceptor(new Interceptor() {        @Override        public Response intercept(Chain chain) throws IOException {          Request request = chain              .request()              .newBuilder()              .build();          return chain.proceed(request);        }      })      .readTimeout(10, TimeUnit.SECONDS)//設置讀取超時時間      .writeTimeout(10, TimeUnit.SECONDS)//設置寫的超時時間      .connectTimeout(15, TimeUnit.SECONDS)//設置連接超時時間      .build();  /**   * 實例--》添加商品   */  public static void addCoupon( int shopperId,String shopperName,                 File file, final UIDataListener listener) {    String url = "shopappajx/shopAppCouponAction_saveCoupon.htm";    Map<String, Object> map = new HashMap<>();    map.put("shopperId", shopperId);    map.put("shopperName", shopperName);    map.put("couponImage", file);//商品圖片    uploadImgAndParameter(map, url, listener);  }  //上傳圖片共有方法  private synchronized final static void uploadImgAndParameter(Map<String, Object> map, String url,      final UIDataListener listener) {    // mImgUrls為存放圖片的url集合    MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);    if (null != map) {      for (Map.Entry<String, Object> entry : map.entrySet()) {        if (entry.getValue() != null) {          if (entry.getValue() instanceof File) {            File f = (File) entry.getValue();            builder.addFormDataPart(entry.getKey(), f.getName(), RequestBody.create(MEDIA_TYPE_PNG, f));          } else {            builder.addFormDataPart(entry.getKey(), entry.getValue().toString());          }        }      }    }    //創建RequestBody    RequestBody body = builder.build();//    MultipartBody requestBody = builder.build();    //構建Request請求    final Request request = new Request.Builder()        .url(url)//地址        .post(body)//添加請求體//        .post(requestBody)//添加請求體        .build();    client.newCall(request).enqueue(new okhttp3.Callback() {      @Override      public void onResponse(Call call, final Response response) throws IOException {        if (response.isSuccessful()) {//判斷是否成功          final String data = response.body().string();//string()僅可調用一次。否則報IllegalStateException: closed異常          Log.i("file1", "上傳照片成功-->" + data);          onSuccess(listener, data);          call.cancel();//上傳成功取消請求釋放內存        }      }      @Override      public void onFailure(Call call, final IOException e) {        Log.i("file2", "上傳失敗-->" + e.getMessage());        String msg = e.getMessage();        if (msg == null || msg.equals("timeout")) {          onError(listener, "網絡不穩定請求超時!");        } else {          onError(listener, e.getMessage());        }        call.cancel();//上傳失敗取消請求釋放內存      }    });  }  private final static void onSuccess(final UIDataListener listener, final String data) {    handler.post(new Runnable() {      public void run() {        // 需要在主線程的操作。        listener.onSuccess(data);      }    });  }  private final static void onError(final UIDataListener listener, final String msg) {    if (null != listener) {      handler.post(new Runnable() {        public void run() {          // 需要在主線程的操作。          listener.onFailure(msg);        }      });    }  }  public interface UIDataListener {   //網絡請求成功    void onSuccess(String data);   //網絡請求失敗    void onFailure(String errorMassage);  }}

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持武林網!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 彰化市| 福海县| 易门县| 老河口市| 南康市| 兴义市| 东安县| 巩留县| 杭锦旗| 怀宁县| 昆山市| 曲阜市| 上蔡县| 南阳市| 高安市| 汽车| 资源县| 普陀区| 定日县| 铁力市| 柞水县| 调兵山市| 柘城县| 偃师市| 徐闻县| 青海省| 曲阜市| 湖州市| 化德县| 汉阴县| 马龙县| 大英县| 嵊泗县| 贺兰县| 曲靖市| 广饶县| 理塘县| 理塘县| 嘉荫县| 镇沅| 尉犁县|