首先在這裏本片文章是以網絡通訊封裝爲主,而app開發首先重要就是網絡通訊,而現在主流的async、volley、okhttp等,阿麼這麼網絡庫怎樣能作到更好封裝、更好的切換,從而不影響業務層的代碼,而本文就是基於這個思路,從而封裝了okhttp,並能支持封裝切換到async、或者volley,後期會支持這兩個庫的所有特性。並在調用時候無影響。當前版本號2.6。github地址:java
https://github.com/apple317/HttpClientUtils git
眼下支持github
Android Studioapi
使用前,對於Android Studio的用戶,可以選擇加入:數組
compile project(':HttpClientUtils')
HttpConfiguration.Builder configuration=new HttpConfiguration.Builder(getApplicationContext()); configuration.connectTimeout(2000); configuration.retryOnConnectionFailure(true); configuration.readTimeout(2000); configuration.writeTimeout(2000); configuration.diskCacheSize(1000 * 1024); configuration.diskCacheDir(getCacheDir()); BaseHttpClient.getBaseClient().init(configuration.build());裏面設置超時、讀寫時間、緩衝路徑等
/** * 普通參數請求方式 * url 傳入網絡地址 * put傳入值 * tag設置tag */ public void getParam(View view) { BaseHttpClient.getBaseClient().newBuilder() .url("http://api.dianping.com/v1/metadata/get_cities_with_deals") .put("appkey", "56065429") .setParse(UserBean.class) .put("sign", "AF24BF8A3F31D22D25422BCDD86AA322F43B5BAB") .setTag("deals").build().execute(new HttpCallback() { @Override public void onSuccess(String content, BaseHttpClient object, Object parse) { //刷新ui操做 } @Override public void onError(Throwable error, BaseHttpClient client) { } }); }
在demo中PostActivity中的postStringData方法:網絡
/** * post上傳字符串 * addUrl傳入url地址 * put傳入參數可以 * apple_txt 這個是專門用來傳入文本上傳的,請注意 */ public void postStringData(View view) { /** * 第一種寫法 */ BaseHttpClient.getBaseClient().newBuilder().url("url") .content("你好好好").method(METHOD.POST_STRING) .build().execute(new HttpCallback() { @Override public void onSuccess(String content, BaseHttpClient object, Object parse) { //刷新ui } @Override public void onError(Throwable error, BaseHttpClient client) { } }); }
/** * 普通post請求數據 * 默認以表單提交 * addUrl傳入url地址 * put傳入參數可以 *setTag 設置tag */ public void postData(View view) { /** * 第一種寫法 */ BaseHttpClient.getBaseClient().newBuilder() .url("url") .put("device_id", "1236716") .setTag("postactivity").put("os", "2") .put("version", "2.1.0"). put("mobile", "13621937708").method(METHOD.POST_FORM) .build().execute(new HttpCallback() { @Override public void onSuccess(String content, BaseHttpClient object, Object parse) { //刷新UI } @Override public void onError(Throwable error, BaseHttpClient client) { } }); }
在demo中PostActivity中的postFormFile方法:session
/** * post * 表單文件上傳 * 默認以表單提交 * addUrl傳入url地址 * put傳入參數可以 *setTag 設置tag * put 傳入logo爲文件上傳定義接口名稱 value:爲文件對象 * setBaseParams 經過這種傳入參數對象 * 上傳文件onProgress 會返回當前網絡上傳的進度 * POST_FORM 是普通表單提交 */ public void postFormFile(View view) { try { File file=new File("path"); ArrayList<File> arrayList=new ArrayList<File>(); arrayList.add(file); // File file = new File(Environment.getExternalStorageDirectory() // , "4cc75752fa532553bf7b6f7e00f26db8.png"); BaseHttpClient.getBaseClient().newBuilder() .url("url") .put("game", "lol") .put("logo", arrayList) .put("token","ee595bd5078a6e67a110c6bd8828c8e2a2388c12") .put("version", "2.1.0") .put("device_id","867905026687709") .put("os","2") .method(METHOD.POST_FORM_FILE).build() .execute(new HttpCallback() { @Override public void onSuccess(String content, BaseHttpClient object, Object parse) { //刷新ui } @Override public void onError(Throwable error, BaseHttpClient client) { } }); } catch (Exception e) { e.printStackTrace(); } }文件上傳進度
在demo中PostActivity中postFormFileProgress方法:
/** * post * 表單文件上傳 * 默認以表單提交 * addUrl傳入url地址 * put傳入參數可以 *setTag 設置tag * put 傳入logo爲文件上傳定義接口名稱 value:爲文件對象 也可以爲文件數組對象 * setBaseParams 經過這種傳入參數對象 * 類型必定要傳入POST_FORM_PROGRESS * 上傳文件onProgress 會返回當前網絡上傳的進度 */ public void postFormFileProgress(View view) { try { File file = new File(Environment.getExternalStorageDirectory() , "4cc75752fa532553bf7b6f7e00f26db8.png"); BaseHttpClient.getBaseClient().newBuilder().url("url") .put("game", "lol") .put("logo", file) .put("token","ee595bd5078a6e67a110c6bd8828c8e2a2388c12") .put("version", "2.1.0") .put("device_id","867905026687709") .put("os","2") .method(METHOD.POST_FORM_PROGRESS).build() .execute(new UploadCallback() { @Override public void onSuccess(String content, BaseHttpClient object, Object parse) { } @Override public void onError(Throwable error, BaseHttpClient client) { } @Override public void uploadProgress(long bytesRead, long contentLength, boolean done) { mProgressBar.setProgress((int) (100 * (float)bytesRead * 1.0f / contentLength)); } }); } catch (Exception e) { e.printStackTrace(); } }
文件下載進度
/** * addUrl 加入url地址 * put傳入參數可以 *setTag 設置tag * downName 下載文件命名 * downDir 下載文件文件夾 假設不傳會默認生成一個getCacheDirectory * DownEntity 下載返回數據實體: * public String name;//名稱 public String path;//保存地址 public String url; public int httpCode;//http網絡狀態 //下載是否完畢 public boolean statue;//下載是否完畢 public long currentByte;//下載當前字節數 public long totalByte;//下載總字節數 public boolean isExecuted;//下載是否運行 public String dir;//下載文件夾 public boolean isCanceled;//下載是否取消 public String message;//下載返回消息 * @param view */ public void downData(View view){ /** * 第一種寫法 */ BaseHttpClient.getBaseClient().newBuilder().url("http://112.65.235.160/vlive.qqvideo.tc.qq.com/m0019469p4a.mp4?vkey=4C7F305D62ABA38AF8BF474C40A0DF9700C8F07BF29BE26D76F17F8A7E73B9FEB1424CC479C4C863BFBDD095AA5EBE49A0CDE3EAEB32E2AD0C009E7C5B37521C0912AF6905C70C601471E664777B9C38C726B03E8D193D62&br=34&platform=2&fmt=msd&sdtfrom=v3010&type=mp4&locid=89489e75-bb18-40e4-989b-89d6b34adf32&size=56306437&ocid=1362567084") .downName("apple_nba").method(METHOD.DOWNLOAD_FILE).build().execute(new DownCallback() { @Override public void downProgress(DownEntity entity) { Log.i("HU", "======bytes===" + entity.currentByte + "==contenLength==" + entity.totalByte); id_progress.setProgress((int) (100 * (float) entity.currentByte * 1.0f / entity.totalByte)); txt_content.setText("當前下載的文件文件夾是"+entity.path+"文件名:"+entity.name+"網絡返回code"+entity.httpCode+"===服務端返回消息=="+entity.message); } }); }app
BaseHttpClient.getBaseClient().cancelTag("url");
BaseHttpClient.getBaseClient() .setTag("deals")
mParams.setTag("tag");異步
比方,在請求中傳入tag對象,銷魂時候可以統一銷燬同一tag對象訪問 @Override protected void onDestroy() { super.onDestroy(); //可以取消同一個tag的 BaseHttpClient.getBaseClient(getApplicationContext()).cancelTag("tag對象"); }
ConcurrentHashMap<String, String> headMap=new ConcurrentHashMap<String, String>(); headMap.put("device","1231231241"); BaseHttpClient.getBaseClient().newBuilder() .url("http://api.dianping.com/v1/metadata/get_cities_with_deals") .put("appkey", "56065429") .setParse(UserBean.class) .setHeadMap(headMap) .put("sign", "AF24BF8A3F31D22D25422BCDD86AA322F43B5BAB") .setTag("deals").build().execute(new HttpCallback() { @Override public void onSuccess(String content, BaseHttpClient object, Object parse) { UserBean userBean=(UserBean)parse; txt_content.setText(userBean.getCities().get(0) + "type===" ); } @Override public void onError(Throwable error, BaseHttpClient client) { } });