public class UploadHelper { /** * 該方法返回observable對象,能夠直接進行觀察;返回的方法均是ui線程 * * [@param](https://my.oschina.net/u/2303379) requestUrl 接口名稱,若是服務域名也不一致,要拼出全路徑 * [@param](https://my.oschina.net/u/2303379) fileMap 文件map,key必定與後臺字段對應 * [@param](https://my.oschina.net/u/2303379) dataMap 基於業務場景,新增參數 * [@param](https://my.oschina.net/u/2303379) listener 接口請求回調 */ public static Observable<String> upload([@NonNull](https://my.oschina.net/u/2981441) final String requestUrl, @NonNull final Map<String, String> fileMap, final Map<String, String> dataMap) { return Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(final Subscriber<? super String> subscriber) { upload(requestUrl, fileMap, dataMap, new UploadListener() { @Override public void onResult(String jsonResult) { subscriber.onNext(jsonResult); } @Override public void onFailed(String errorMsg) { subscriber.onError(new Throwable(errorMsg)); } }); } }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()); } /** * 該方法回調再子線程,若是須要操做ui,須要手動切換ui線程 * * @param requestUrl 接口名稱,若是服務域名也不一致,要拼出全路徑 * @param fileMap 文件map,key必定與後臺字段對應 * @param dataMap 基於業務場景,新增參數 * @param listener 接口請求回調 */ public static void upload(@NonNull String requestUrl, @NonNull Map<String, String> fileMap, Map<String, String> dataMap, final UploadListener listener) { MultipartBody.Builder requestBuilder = new MultipartBody.Builder(); if (fileMap != null && fileMap.size() >= 1) { for (Map.Entry entry : fileMap.entrySet()) { requestBuilder.addFormDataPart(valueOf(entry.getKey()), UUID.randomUUID() + "", RequestBody.create(MediaType.parse("application/octet-stream"), new File(valueOf(entry.getValue())))); } } HashMap<String, String> data = new HashMap<>(); GsonBuilder gsonBuilder = new GsonBuilder(); gsonBuilder.excludeFieldsWithoutExposeAnnotation(); final Gson gson = gsonBuilder.create(); data.put("header", gson.toJson(getRequestJsonHeader())); if (dataMap != null) { data.put("data", gson.toJson(dataMap)); } requestBuilder.addFormDataPart("data", data.toString()); String url = ""; if (!requestUrl.startsWith("http")) { url = Config.url + requestUrl; } else { url = requestUrl; } Request request = new Request.Builder().url(url).post(requestBuilder.build()).build(); RetrofitClient.getInstance(ElectricPayApplication.instance).getOkHttpClient().newBuilder().readTimeout(60, TimeUnit.SECONDS).build().newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { if (listener != null) { listener.onFailed("請檢查您的網絡"); } } @Override public void onResponse(Call call, Response response) throws IOException { if (response.isSuccessful()) { String str = response.body().string(); if (listener != null) { listener.onResult(str); } } else { if (listener != null) { listener.onFailed("請求失敗"); } } } }); } public interface UploadListener { void onResult(String jsonResult); void onFailed(String errorMsg); } public static UploadListener listener; public void setListener(UploadListener listener) { this.listener = listener; } private static Map<String, String> getRequestJsonHeader() { Map<String, String> head = new HashMap<>(); head.put("SESSIONID", SharePreStore.get(ElectricPayApplication.instance, "tempSessionId")); head.put("PLAT", "3");// 對應值1:Symbian 2:WindowsMobile 3:Android 4:IOS head.put("CLIENTVERSION", "android" + android.os.Build.VERSION.RELEASE);// 客戶端系統版本號 head.put("SDKVERSION", "");// sdk應用版本號 head.put("SESSIONID", SharePreStore.get(ElectricPayApplication.instance, "tempSessionId")); return head; }