asyncHttpAndroid 網(wǎng)絡(luò)請求框架
AsyncHttp
一款為android 網(wǎng)絡(luò)請求的框架,采用最少的線程,基于AsyncPool 線程池實(shí)現(xiàn)的 http請求,支持 post和 get、delete等多種請求,實(shí)現(xiàn)請求任務(wù)和結(jié)果異步獲取,支持初中高級開發(fā)人員各階段的代碼習(xí)慣。底層采用的是主線程管理工作線程的模式,并且維護(hù)了自己的請求隊(duì)列,并且采取了任務(wù)的執(zhí)行和結(jié)果的返回采取了不同的線程執(zhí)行,所以更適用于批量網(wǎng)絡(luò)請求
AsyncHttp 有哪些功能?
基本網(wǎng)絡(luò)請求
文件下載(支持?jǐn)帱c(diǎn)下載)
單線程下載
多線程下載
自定義頭部請求信息
含有優(yōu)先級,防止請求無反應(yīng)
文件上傳
使用方法
如何接入?
compile 'com.ml.asynchttp:asynchttp-android:1.0.7'
初始化
AsyncHttpUtils.init(new RequestInterceptorActionInterface() { @Override public <T> BaseHttpRequest<T> interceptorAction(BaseHttpRequest<T> baserequest) throws Exception { TelephonyManager tm = (TelephonyManager) BaseApplication.getInstance().getSystemService(Context.TELEPHONY_SERVICE); return baserequest;
}
}, new ResponseInterceptorActionInterface(){
);
LogUtils.setDebug(true);
參數(shù)1自定義請求處理攔截器,需要實(shí)現(xiàn) RequestInterceptorActionInterface 接口
-
參數(shù)2是結(jié)果過濾器,可以自定義,只需要 實(shí)現(xiàn) ResponseInterceptorActionInterface 接口
提示 : 請求攔截器和過濾器可以在框架初始化添加,也可以在創(chuàng)建請求的時候,添加到請求中
普通網(wǎng)絡(luò)請求
##### 常規(guī)寫法 String url=Contents.baseURL+"user/"+ machineid +"/getDutyList.do"; Log.e("PaiBanActivity",url); AsyncHttpUtils.json(url, HttpMethod.Post, new HashMap<String, String>(), new JsonRequestLoadingCallback<PaiBanBean>(this) { @Override public void requestFail(Exception e, ResponseBody<String> request) {
e.printStackTrace();
showToast("網(wǎng)絡(luò)出錯,請重試");
} @Override public void requsetFinish() {
} @Override public void requsetStart() {
} @Override public void requestSuccess(PaiBanBean paiBanBean) { Log.e("PaiBanActivity",paiBanBean.toString() ); int status = paiBanBean.getStatus(); if (status==1) {
setPaiBan(paiBanBean);
}else {
showToast("獲取數(shù)據(jù)失敗,請重試");
}
}
});
##### 個性寫法
###### 步驟一:定義相關(guān)的接口 public interface PathBeanTest { @JSONPOST("http://{ip}.26.106.136:8080/rest/common/user/login.do") public CProxyRequester test(@PathParam("ip")String ip, @Param("username")String username, @Param("password")String passwork ); @GET("http://{ip}.26.106.136:8080/rest/common/allFactorys.do") public CProxyRequester getAll(@PathParam("ip")String ip);
} *其中,方法注解包含有:JSONPOST POST GET DELETE PUT ....等 ,JSONPOST和POST無技術(shù)上差別,只是為了開發(fā)人員辨識清晰 *方法參數(shù)注解,包含兩種,PathParam,Param ,PathParam表示匹配方法注解上的URL占位符,Param是請求的具體參數(shù) ,注意:
例如上面的 {ip} 方法中@PathParam("ip")String ip 名稱要對應(yīng) 否則,請求失敗
###### 步驟二:通過代理實(shí)例化接口 PathBeanTest t= ProxyCreater.creator(PathBeanTest.class);
###### 步驟三:設(shè)置結(jié)果處理線程級別
t.getAll("120").ResultMonitor(MIO.MainThread).Observation(new StringRequestResultCallBack<FactoryTestBean>() { @Override public void requestFail(Exception e, ResponseBody<String> request) {
} @Override public void requestSuccess(FactoryTestBean factoryTestBean) { Log.e("tag",factoryTestBean.getMsg()+" "+factoryTestBean.getData().getList().size());
} @Override public void requsetFinish() {
} @Override public void requsetStart() {
}
});
######MIO.MainThread表示主線程,MIO.IOThread 表示IO線程
文件的下載
寫法一: String url="http://scimg.jb51.net/allimg/160815/103-160Q509544OC.jpg"; //必須設(shè)置存儲路徑 String filepath="C:\\Users\\admin\\Pictures\\Camera Roll\\img"+i+".jpg"; FileRequest resReques=new FileRequest(url);
resReques.setFilepath(filepath);
resReques.addHead(new Header("user-agent", "AsyHttp/1.0 ml"));
resReques.setRequestMethod(HttpMethod.Get); TaskHandler taskhandler= AsyncHttp.instance().download(resReques, new FileTest()); //可以調(diào)用 taskhandler.stop()方法取消任務(wù) //FileTest 是 繼承了 DownProgrossCallback<ResponseBody<T>>的 回掉接口,實(shí)現(xiàn)進(jìn)度的監(jiān)控,和結(jié)果的返回 }
寫法二: AsyncHttpUtils.download("http://pic1.sc.chinaz.com/files/pic/pic9/201611/apic24088.jpg", "/sdcard/test/", "file.jpg", new DownProgrossCallback<ResponseBody<File>>() { @Override public void download_current(long current, long total) { Log.e("tag", "current=" + current + " total=" + total); int pr = (int) (current * 100.0 / total);
xiazai_pr.setProgress(pr);
} @Override public void start() { Toast.makeText(getApplication(), "開始下載", Toast.LENGTH_SHORT).show();
} @Override public void finish() { Toast.makeText(getApplication(), "完成", Toast.LENGTH_SHORT).show();
} @Override public void success(ResponseBody<File> result) { Toast.makeText(getApplication(), "成功下載" + result.getResult().getPath(), Toast.LENGTH_SHORT).show();
} @Override public void fail(Exception e, ResponseBody<File> request) {
e.printStackTrace(); Toast.makeText(getApplication(), e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
寫法三: public interface DownloadTest { @DOWNLOAD("http://pic6.nipic.com/20100426/1687102_082357914928_2.jpg") public CProxyRequester<File> down(@Param String path);
} DownloadTest downloadTest=ProxyCreater.creator(DownloadTest.class);
downloadTest.down("/sdcard/test/file2.jpg").ResultMonitor(MIO.MainThread).Observation(new DownProgrossCallback<ResponseBody<File>>() { @Override public void download_current(long current, long total) {
} @Override public void start() {
} @Override public void finish() {
} @Override public void success(ResponseBody<File> result) {
} @Override public void fail(Exception e, ResponseBody request) {
}
});
多線程下載文件
String urls="http://img.taopic.com/uploads/allimg/130711/318756-130G1222R317.jpg"; String name=urls.substring(urls.lastIndexOf("/")+1,urls.length()); String filepath="C:\\Users\\admin\\Pictures\\Camera Roll\\"+name;
download s= new download(new RecordEntity(urls,filepath));
s.setTaskPriority(TaskPriority.LOWEST.getValue());//設(shè)置優(yōu)先級 TaskHandler t= AsyncHttp.instance().download(s, new DownProgrossCallback<ResponseBody<RandomAccessFile>>() { @Override public void download_current(long current, long total) { // TODO Auto-generated method stub // System.out.println("當(dāng)前 "+e+" current=="+current+" total="+total); } @Override public void fail(Exception e1,ResponseBody<RandomAccessFile> response) { // TODO Auto-generated method stub super.fail(e1,response); System.out.println("任務(wù) "+ e+" ="+ Utils.getNowTime()+" e1="+e1.getMessage());
} @Override public void start() { // TODO Auto-generated method stub super.start(); System.out.println("任務(wù) "+ e+" startTime="+ Utils.getNowTime());
} @Override public void finish() { // TODO Auto-generated method stub super.finish(); System.out.println("任務(wù) "+ e+" endTime="+ Utils.getNowTime());
}
});
上傳文件 (單線程)
#####一般寫法1 String url="http://192.168.1.33:8080/StrutsDemo2/upload.action"; UploadRequest resReques=new UploadRequest(url);
resReques.addParam(new FileParamPart("upload", new File("C:\\Users\\admin\\Pictures\\Camera Roll\\img10.jpg"),Constents.TYPE_IMAGE));
resReques.setRequestMethod(HttpMethod.Post); AsyncHttp.instance().newRequest2(resReques, new uploadTest()); //uploadTest是 繼承了 UploadProgrossCallback<ResponseBody<T>>的 回掉接口,實(shí)現(xiàn)進(jìn)度的監(jiān)控,和結(jié)果的返回 #####一般寫法2 AsyncHttpUtils.upload("http://120.26.106.136:8080/rest/common/user/uploadAvatar.do", "/sdcard/test/test.jpg", "file", new UploadProgrossCallback<ResponseBody<String>>() { @Override public void upload_current(long current, long currentFileTotal, long total) { int pr = (int) (current * 100.0 / total); Log.e("tag", "current=" + current + " currentFileTotal= " + currentFileTotal + " total=" + total);
progressBar_shangchuan.setProgress(pr);
} @Override public void start() { Toast.makeText(getApplication(), "開始上傳", Toast.LENGTH_SHORT).show();
} @Override public void finish() { Toast.makeText(getApplication(), "完成", Toast.LENGTH_SHORT).show();
} @Override public void success(ResponseBody<String> result) { Log.e("tag", result.getResult());
} @Override public void fail(Exception e, ResponseBody<String> request) { Toast.makeText(getApplication(), e.getMessage(), Toast.LENGTH_SHORT).show();
e.printStackTrace(); Log.e("tag", request.getResult());
}
});
#####個性寫法 public interface UploadTest { @UPLOAD("http://120.26.106.136:8080/rest/common/user/uploadFile.do") public CProxyRequester<UploadResultBean> upload(@Param("file") String filepath);
} UploadTest uploadTest= ProxyCreater.creator(UploadTest.class);
uploadTest.upload("/sdcard/test/file.jpg").ResultMonitor(MIO.MainThread).Observation(new UploadRequestResultCallBack<UploadResultBean>(){ @Override public void upload_current(long current, long currentFileTotal, long total) { int pr = (int) (current * 100.0 / total); Log.e("tag", "current=" + current + " currentFileTotal= " + currentFileTotal + " total=" + total);
progressBar_shangchuan.setProgress(pr);
} @Override public void requestFail(Exception e, ResponseBody<String> request) {
e.printStackTrace();
} @Override public void requestSuccess(UploadResultBean uploadResultBean) { Log.e("tag",uploadResultBean.getMsg()); Toast.makeText(getApplicationContext(),uploadResultBean.getData().getName(),Toast.LENGTH_LONG).show();
} @Override public void requsetFinish() {
} @Override public void requsetStart() {
}
});
有問題反饋
在使用中有任何問題,歡迎反饋給我,可以用以下聯(lián)系方式跟我交流
作者其他開源
評論
圖片
表情
