|  |  | 
 |  |  | package com.dayu.pipirrapp.net; | 
 |  |  |  | 
 |  |  | import static com.dayu.pipirrapp.bean.net.UplodFileState.STATE_DONE; | 
 |  |  | import static com.dayu.pipirrapp.bean.net.UplodFileState.STATE_ERROR; | 
 |  |  | import static com.dayu.pipirrapp.bean.net.UplodFileState.STATE_UPDING; | 
 |  |  | import static com.luck.picture.lib.thread.PictureThreadUtils.runOnUiThread; | 
 |  |  |  | 
 |  |  | import android.annotation.SuppressLint; | 
 |  |  | 
 |  |  | import com.dayu.pipirrapp.bean.net.CodeResult; | 
 |  |  | import com.dayu.pipirrapp.bean.net.UplodFileState; | 
 |  |  | import com.dayu.pipirrapp.bean.net.WeatherResponse; | 
 |  |  | import com.dayu.pipirrapp.bean.net.UploadFileResult; | 
 |  |  | import com.dayu.pipirrapp.net.subscribers.BaseProgressSubscriber; | 
 |  |  | import com.dayu.pipirrapp.net.subscribers.CodeListener; | 
 |  |  | import com.dayu.pipirrapp.net.subscribers.ProgressSubscriber; | 
 |  |  | 
 |  |  | import com.dayu.pipirrapp.utils.MyJsonParser; | 
 |  |  | import com.dayu.pipirrapp.utils.MyLog; | 
 |  |  | import com.dayu.pipirrapp.utils.NetUtils; | 
 |  |  | import com.google.gson.internal.LinkedTreeMap; | 
 |  |  |  | 
 |  |  | import java.io.File; | 
 |  |  | import java.util.HashMap; | 
 |  |  | 
 |  |  |     static ApiManager apiManager; | 
 |  |  |     //文件上传失败重复次数 | 
 |  |  |     int uplodFilerepeatSize = 3; | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     ApiService apiService; | 
 |  |  |     // 管理订阅事件 | 
 |  |  | 
 |  |  | //    } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 上传文件 | 
 |  |  |      * 上传图片文件 | 
 |  |  |      * | 
 |  |  |      * @param context | 
 |  |  |      * @param uplodData | 
 |  |  |      * @param listener | 
 |  |  |      */ | 
 |  |  |     public void uploadFile(final Context context, final UplodFileState uplodData, final UploadFileListener listener, final AddPictureAdapter adapter) { | 
 |  |  |         MyLog.d("progressRequestBody>>>" + "path:" + uplodData.getFilePath()); | 
 |  |  |  | 
 |  |  |         if (!TextUtils.isEmpty(uplodData.getFilePath())) { | 
 |  |  |             MyLog.d("progressRequestBody_uploadFile>>>" + "path:" + uplodData.getFilePath() + ">>>uploadType:" + uplodData.getUploadType()); | 
 |  |  |             uplodData.setState(STATE_UPDING); | 
 |  |  |             File file = new File(uplodData.getFilePath()); | 
 |  |  |             RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file); | 
 |  |  |             ProgressRequestBody progressRequestBody = new ProgressRequestBody(requestBody, (bytesWritten, contentLength, done) -> { | 
 |  |  | 
 |  |  |                 int progress = (int) (100 * bytesWritten / contentLength); | 
 |  |  |                 // 例如:更新 ProgressBar 或显示进度 | 
 |  |  |                 runOnUiThread(() -> { | 
 |  |  |                     uplodData.setProgress(progress); | 
 |  |  |                     if (progress <5) { | 
 |  |  |                         uplodData.setProgress(0); | 
 |  |  |                     } | 
 |  |  |                     // 进度条更新代码 | 
 |  |  |                     if (adapter != null && uplodData.getAdapterPosition() != -1) { | 
 |  |  |                         adapter.updateProgress(uplodData); | 
 |  |  |                         //优化不频繁更新进度 | 
 |  |  |                         if (progress - uplodData.getProgress() > 5 || progress == 100) { | 
 |  |  |                             uplodData.setProgress(progress); | 
 |  |  |                             adapter.updateProgress(uplodData); | 
 |  |  |  | 
 |  |  |                         } | 
 |  |  |  | 
 |  |  |                     } | 
 |  |  |                     MyLog.d("progressRequestBody>>>" + "adapterPosition:" + uplodData.getAdapterPosition() + ">>>上传进度: " + progress + "%"); | 
 |  |  |                     MyLog.d("progressRequestBodyHolder>>>path" + "adapterPosition:" + uplodData.getAdapterPosition() + ">>>上传进度: " + progress + "%"); | 
 |  |  |                 }); | 
 |  |  |  | 
 |  |  |             }); | 
 |  |  |             MultipartBody.Part body = MultipartBody.Part.createFormData("file", file.getName(), progressRequestBody); | 
 |  |  |             RequestBody description = RequestBody.create(MediaType.parse("text/plain"), "file description"); | 
 |  |  |             Call<BaseResponse> uploadFile = apiService.uploadFile(body, description); | 
 |  |  |             Call<BaseResponse<UploadFileResult>> uploadFile = null; | 
 |  |  |             switch (uplodData.getUploadType()) { | 
 |  |  |                 case UplodFileState.IMG_TYPE: | 
 |  |  |                     uploadFile = apiService.uploadImgFile(body, description); | 
 |  |  |                     break; | 
 |  |  |                 case UplodFileState.VIDEO_TYPE: | 
 |  |  |                     uploadFile = apiService.uploadVideoFile(body, description); | 
 |  |  |                     break; | 
 |  |  |                 default: | 
 |  |  |                     uploadFile = apiService.uploadImgFile(body, description); | 
 |  |  |                     break; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             uplodData.setThisCall(uploadFile); | 
 |  |  |             uploadFile.enqueue(new Callback<BaseResponse>() { | 
 |  |  |             uploadFile.enqueue(new Callback<BaseResponse<UploadFileResult>>() { | 
 |  |  |                 @Override | 
 |  |  |                 public void onResponse(Call<BaseResponse> call, Response<BaseResponse> response) { | 
 |  |  |                 public void onResponse(Call<BaseResponse<UploadFileResult>> call, Response<BaseResponse<UploadFileResult>> response) { | 
 |  |  |                     if (response.body() != null) { | 
 |  |  |                         if (response.body().isSuccess()) { | 
 |  |  |                             uplodData.setState(1); | 
 |  |  |                             uplodData.setPostId(((LinkedTreeMap) response.body().getContent()).get("id").toString()); | 
 |  |  |                             uplodData.setWebPath(((LinkedTreeMap) response.body().getContent()).get("webPath").toString()); | 
 |  |  |                             UploadFileResult uploadFileResult=response.body().getContent(); | 
 |  |  |                             uplodData.setState(STATE_DONE); | 
 |  |  |                             uplodData.setPostId(uploadFileResult.getId()); | 
 |  |  |                             uplodData.setUoloadFilePath(uploadFileResult.getFilePath()); | 
 |  |  |                             uplodData.setHash(uploadFileResult.getHash()); | 
 |  |  |                             uplodData.setWebPathZip(uploadFileResult.getWebPathZip()); | 
 |  |  |                             listener.onBack(uplodData); | 
 |  |  |                         } else { | 
 |  |  |                             MyLog.d("progressRequestBody>>>" + response.body().getMsg()); | 
 |  |  |                             if (uplodData.getNumber() <= uplodFilerepeatSize) { | 
 |  |  |                                 uplodData.setNumber(uplodData.getNumber() + 1); | 
 |  |  |                                 uplodData.setState(2); | 
 |  |  |                                 uplodData.setState(STATE_ERROR); | 
 |  |  |                                 uploadFile(context, uplodData, listener, adapter); | 
 |  |  |                             } else { | 
 |  |  |                                 uplodData.setState(STATE_ERROR); | 
 |  |  |                                 uplodData.setNumber(0); | 
 |  |  |                                 listener.onBack(uplodData); | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 @Override | 
 |  |  |                 public void onFailure(Call<BaseResponse> call, Throwable t) { | 
 |  |  |                     MyLog.d("progressRequestBody>>>" + "onFailure:"); | 
 |  |  |                     if (uplodData.getNumber() <= uplodFilerepeatSize) { | 
 |  |  |                         uplodData.setNumber(uplodData.getNumber() + 1); | 
 |  |  |                         uplodData.setState(2); | 
 |  |  |                         uploadFile(context, uplodData, listener, adapter); | 
 |  |  |                     } else { | 
 |  |  |                         listener.onBack(uplodData); | 
 |  |  |                 public void onFailure(Call<BaseResponse<UploadFileResult>> call, Throwable t) { | 
 |  |  |                     MyLog.d("progressRequestBody>>>" + "onFailure:" + t.getMessage()); | 
 |  |  |                     if (!t.getMessage().equals("Canceled")) { | 
 |  |  |                         uplodData.setState(STATE_ERROR); | 
 |  |  |                         if (uplodData.getNumber() <= uplodFilerepeatSize) { | 
 |  |  |                             uplodData.setNumber(uplodData.getNumber() + 1); | 
 |  |  |                             uploadFile(context, uplodData, listener, adapter); | 
 |  |  |                         } else { | 
 |  |  |                             uplodData.setNumber(0); | 
 |  |  |                             listener.onBack(uplodData); | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                 } | 
 |  |  |             }); | 
 |  |  |         } else { | 
 |  |  |             uplodData.setState(UplodFileState.STATE_ERROR); | 
 |  |  |             uplodData.setState(STATE_ERROR); | 
 |  |  |             listener.onBack(uplodData); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  |