AsyncHttp
基於java線程池 實現的 http請求,支持 post和 get、delete等多種請求,實現請求任務和結果異步獲取
,簡化網絡請求
AsyncHttp有哪些功能?
- 基本網絡請求
- 文件下載(支持斷點下載)
- 單線程下載
- 多線程下載
- 自定義頭部請求信息
- 含有優先級,防止請求無反應
- 文件上傳
使用方法
如何接入?
“`java
compile ‘com.ml.asynchttp:asynchttp-android:1.1.1’
“`
初始化
“`java
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);
“`
- 參數1自定義請求處理攔截器,需要實現 RequestInterceptorActionInterface 接口
參數2是結果過濾器,可以自定義,只需要 實現 ResponseInterceptorActionInterface 接口
提示 : 請求攔截器和過濾器可以在框架初始化添加,也可以在創建請求的時候,添加到請求中
普通網絡請求
##### 常規寫法
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("網絡出錯,請重試");
}
@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("獲取數據失敗,請重試");
}
}
});
##### 個性寫法
###### 步驟一:定義相關的接口
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無技術上差別,只是爲了開發人員辨識清晰
*方法參數註解,包含兩種,PathParam,Param ,PathParam表示匹配方法註解上的URL佔位符,Param是請求的具體參數 ,注意:
例如上面的 {ip} 方法中@PathParam("ip")String ip 名稱要對應 否則,請求失敗
###### 步驟二:通過代理實例化接口
PathBeanTest t= ProxyCreater.creator(PathBeanTest.class);
###### 步驟三:設置結果處理線程級別
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";
//必須設置存儲路徑
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());
//可以調用 taskhandler.stop()方法取消任務
//FileTest 是 繼承了 DownProgrossCallback<ResponseBody<T>>的 回掉接口,實現進度的監控,和結果的返回
}
寫法二:
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/game.apk").ResultMonitor(MIO.MainThread).Observation(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() {
xiazai_pr.setMax(100);
}
@Override
public void finish() {
}
@Override
public void success(ResponseBody<File> result) {
Log.e("tag",result.getResult().getAbsolutePath());
}
@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());//設置優先級
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("當前 "+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("任務 "+ e+" ="+ Utils.getNowTime()+" e1="+e1.getMessage());
}
@Override
public void start() {
// TODO Auto-generated method stub
super.start();
System.out.println("任務 "+ e+" startTime="+ Utils.getNowTime());
}
@Override
public void finish() {
// TODO Auto-generated method stub
super.finish();
System.out.println("任務 "+ 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
android 代碼混淆
-keep class com.async.**
-keepclassmembers class com.async.** { *; }
-keep enum com.async.**
-keepclassmembers enum com.async.** { *; }
-keep interface com.async.**
-keepclassmembers interface com.async.** { *; }
有問題反饋
在使用中有任何問題,歡迎反饋給我,可以用以下聯繫方式跟我交流
- 郵件:[email protected]
- QQ羣: 366802936
- github:https://github.com/MengLeiGitHub/)