中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android開發中利用Retrofit如何將圖文上傳到服務器

發布時間:2020-12-01 16:27:22 來源:億速云 閱讀:275 作者:Leah 欄目:移動開發

Android開發中利用Retrofit如何將圖文上傳到服務器?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

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

開發環境: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);
  }
}

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

象山县| 云安县| 霸州市| 河南省| 双峰县| 勃利县| 平凉市| 嘉善县| 镇远县| 化德县| 梓潼县| 东乌珠穆沁旗| 青冈县| 白朗县| 蒙城县| 和平县| 左云县| 上虞市| 崇仁县| 重庆市| 南宫市| 阿拉善左旗| 荆州市| 蕲春县| 梁山县| 绥滨县| 梅河口市| 陈巴尔虎旗| 文登市| 苏尼特右旗| 武川县| 云林县| 遂川县| 手游| 云阳县| 嫩江县| 富顺县| 苏尼特左旗| 阿克陶县| 平阴县| 阳江市|