欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Retrofit實現(xiàn)圖文上傳至服務(wù)器

 更新時間:2017年03月28日 12:00:11   作者:曦笑大海  
本文主要介紹了Retrofit實現(xiàn)圖文上傳至服務(wù)器的相關(guān)知識。具有很好的參考價值,下面跟著小編一起來看下吧

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

開發(fā)環(huán)境:AndroidStudio

1.引入依賴:

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

2.網(wǎng)絡(luò)權(quán)限:

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

3.創(chuàng)建上傳對象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)//設(shè)置讀取超時時間
   .writeTimeout(10, TimeUnit.SECONDS)//設(shè)置寫的超時時間
   .connectTimeout(15, TimeUnit.SECONDS)//設(shè)置連接超時時間
   .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());
     }
    }
   }
  }
  //創(chuàng)建RequestBody
  RequestBody body = builder.build();

//  MultipartBody requestBody = builder.build();
  //構(gòu)建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()僅可調(diào)用一次。否則報IllegalStateException: closed異常
     Log.i("file1", "上傳照片成功-->" + data);
     onSuccess(listener, data);
     call.cancel();//上傳成功取消請求釋放內(nèi)存
    }
   }
   @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, "網(wǎng)絡(luò)不穩(wěn)定請求超時!");
    } else {
     onError(listener, e.getMessage());
    }
    call.cancel();//上傳失敗取消請求釋放內(nèi)存
   }
  });
 }

//注意:添加手機(jī)圖片,別忘了添加SD卡權(quán)限

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)//設(shè)置讀取超時時間
      .writeTimeout(10, TimeUnit.SECONDS)//設(shè)置寫的超時時間
      .connectTimeout(15, TimeUnit.SECONDS)//設(shè)置連接超時時間
      .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());
          }
        }
      }
    }
    //創(chuàng)建RequestBody
    RequestBody body = builder.build();

//    MultipartBody requestBody = builder.build();
    //構(gòu)建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()僅可調(diào)用一次。否則報IllegalStateException: closed異常
          Log.i("file1", "上傳照片成功-->" + data);
          onSuccess(listener, data);
          call.cancel();//上傳成功取消請求釋放內(nèi)存
        }
      }
      @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, "網(wǎng)絡(luò)不穩(wěn)定請求超時!");
        } else {
          onError(listener, e.getMessage());
        }
        call.cancel();//上傳失敗取消請求釋放內(nèi)存
      }
    });
  }
  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 {
   //網(wǎng)絡(luò)請求成功
    void onSuccess(String data);
   //網(wǎng)絡(luò)請求失敗
    void onFailure(String errorMassage);
  }
}

以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!

相關(guān)文章

  • Android 馬賽克(Mosaics)效果

    Android 馬賽克(Mosaics)效果

    這篇文章主要為大家介紹了Android 馬賽克(Mosaics)效果,馬賽克(Mosaics)效果應(yīng)用非常廣泛,想要學(xué)習(xí)的不要錯過本文,可以借鑒參考一下
    2016-01-01
  • android dialog自定義實例詳解

    android dialog自定義實例詳解

    簡單的自定義dialog,該dialog具備以下功能:有一個窗口可以顯示文章、根據(jù)需求顯示,有需要的朋友可以參考下
    2012-12-12
  • Android Fragment的靜態(tài)注冊和動態(tài)注冊創(chuàng)建步驟

    Android Fragment的靜態(tài)注冊和動態(tài)注冊創(chuàng)建步驟

    這篇文章主要介紹了Android Fragment的靜態(tài)注冊和動態(tài)注冊創(chuàng)建步驟,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • Android開發(fā)MQTT協(xié)議的模型及通信淺析

    Android開發(fā)MQTT協(xié)議的模型及通信淺析

    這篇文章主要W為大家介紹了Android開發(fā)MQTT協(xié)議的模型及通信淺析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Android 通過Messager與Service實現(xiàn)進(jìn)程間雙向通信案例詳解

    Android 通過Messager與Service實現(xiàn)進(jìn)程間雙向通信案例詳解

    這篇文章主要介紹了Android 通過Messager與Service實現(xiàn)進(jìn)程間雙向通信案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • Android實現(xiàn)加載圈

    Android實現(xiàn)加載圈

    這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)加載圈,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • Phonegap使用拍照功能時的內(nèi)存問題

    Phonegap使用拍照功能時的內(nèi)存問題

    最近幾天在學(xué)習(xí)使用phonegap進(jìn)行android應(yīng)用的開發(fā),網(wǎng)上的資料比較亂,個人參考了很多資料,也試驗了很多次,一直在摸索,總算小有心得,這此過程中也遇到了一些問題,這里給大家分享下解決Phonegap使用拍照功能時的內(nèi)存問題的方法,這里簡單的整理一下
    2015-05-05
  • android實現(xiàn)Splash閃屏效果示例

    android實現(xiàn)Splash閃屏效果示例

    這篇文章主要介紹了android實現(xiàn)Splash閃屏效果的方法,涉及Android中postDelayed方法及AndroidManifest.xml權(quán)限控制的相關(guān)使用技巧,需要的朋友可以參考下
    2016-08-08
  • Android聊天工具基于socket實現(xiàn)

    Android聊天工具基于socket實現(xiàn)

    這篇文章主要介紹了基于socket實現(xiàn)的一個簡單的Android聊天工具,實現(xiàn)方法簡單,具有一定的參考價值,感興趣的朋友可以參考一下
    2016-02-02
  • Android編程中@id和@+id的區(qū)別分析

    Android編程中@id和@+id的區(qū)別分析

    這篇文章主要介紹了Android編程中@id和@+id的區(qū)別,較為詳細(xì)的分析講述了Android中資源引入的原理及使用@id和@+id引入資源的具體用法,總結(jié)了二者的區(qū)別,需要的朋友可以參考下
    2016-01-01

最新評論