java http 异步请求框架_GitHub - huangdali/MyHttpUtils: 一个非常好用的异步网络请求框架...
輕量級(jí)網(wǎng)絡(luò)請求框架MyHttputils
一、前言
本版代碼大換血,使用了策略模式和構(gòu)造模式來組織代碼,增加了更加人性化的請求構(gòu)造,代碼質(zhì)量提高、效率顯著提升。(但是使用風(fēng)格基本沒變哦)
2.0.2版本的基本的用法在《android網(wǎng)絡(luò)請求框架》一個(gè)輕量級(jí)的異步網(wǎng)絡(luò)請求框架MyHttpUtils(新版更新記錄,版本號(hào):2.X)中有過詳細(xì)的介紹。下面是對2.1.5版的詳細(xì)使用介紹,對源碼感興趣的伙伴可以移步github了解更多的消息。
二、功能介紹
1、支持get、post請求;
2、支持http和https的協(xié)議;
3、支持設(shè)置連接、讀取超時(shí)時(shí)間(可選);
4、支持json格式的請求結(jié)果(無論json格式多復(fù)雜,都能搞定);
5、支持傳入JavaBean對象(解析之后的javabean對象);
6、支持回調(diào)方法中反應(yīng)傳入javabean對象,這樣可以在回調(diào)方法中直接拿到解析過后的javabean對象;
7、支持回調(diào)方法中更新UI(所以叫異步請求了);
8、支持文件下載;---->帶下載進(jìn)度回調(diào)方法
9、支持單文件上傳;
10、支持多文件上傳;
11、支持請求完成后回調(diào)--->onComplete方法;
12、支持直接獲取字符串;
13、支持參數(shù)與文件同時(shí)上傳;
14、提供錯(cuò)誤信息處理類;
MyHttpUtils滿足了大部分的網(wǎng)絡(luò)請求了,而且非常輕量級(jí)哦(大小:20.76k)
三、快速使用
使用gradle添加依賴(添加完之后Sync一下):
compile 'com.huangdali:myhttputils:2.1.5'
當(dāng)然了網(wǎng)絡(luò)權(quán)限可別忘加哦
文件上傳和下載也需要添加權(quán)限(不要這個(gè)功能的就不用加)
##四、入門案例
###4.1、簡單的一個(gè)網(wǎng)絡(luò)請求(直接獲取請求的結(jié)果--->字符串)
MyHttpUtils.build()//構(gòu)建myhttputils
.url("http://192.168.2.153:8080/MyHttpUtilsServer/string.action")//請求的url
.onExecute(new StringCallBack() {//開始執(zhí)行,并有一個(gè)回調(diào)(異步的哦---->直接可以更新ui)
@Override
public void onSucceed(String result) {//請求成功之后會(huì)調(diào)用這個(gè)方法
//成功之后的拿到結(jié)果result進(jìn)行處理
}
@Override
public void onFailed(Throwable throwable) {//請求失敗的時(shí)候會(huì)調(diào)用這個(gè)方法
//失敗之后的拿到錯(cuò)誤結(jié)果throwable進(jìn)行處理
}
});
通過上面的代碼就能發(fā)起get請求;
下面結(jié)合一個(gè)案例類演示:用戶輸入字母,點(diǎn)擊轉(zhuǎn)換即可得到對應(yīng)的大寫字母。(小寫轉(zhuǎn)大寫案例)
參數(shù): content
請求方式: get
先看效果:
來看怎么實(shí)現(xiàn):
/**
* 單擊轉(zhuǎn)換按鈕的事件
*
* @param view
*/
public void onUpperCase(View view) {
String content = etContent.getText().toString();//拿到用戶輸入的內(nèi)容
MyHttpUtils.build()//構(gòu)建myhttputils
.url("http://192.168.2.153:8080/MyHttpUtilsServer/string.action")//請求的url
.addParam("content",content)
.onExecute(new StringCallBack() {//開始執(zhí)行,并有一個(gè)回調(diào)(異步的哦---->直接可以更新ui)
@Override
public void onSucceed(String result) {//請求成功之后會(huì)調(diào)用這個(gè)方法----顯示結(jié)果
tvResult.append("\n");
tvResult.append(Html.fromHtml("" + result + ""));
tvResult.append("\n");
}
@Override
public void onFailed(Throwable throwable) {//請求失敗的時(shí)候會(huì)調(diào)用這個(gè)方法
ToastUtils.showToast(UpperCaseActivity.this, FailedMsgUtils.getErrMsgStr(throwable));
}
});
}
ToastUtils是簡單封裝的Toast顯示工具,FailedMsgUtils是myhttputils提供的一個(gè)用于得到錯(cuò)誤信息的工具
對于get請求,還可以這樣搞------>直接拼接即可(參數(shù)含中文時(shí)不建議使用此方法)
MyHttpUtils.build()//構(gòu)建myhttputils
.url("http://192.168.2.153:8080/MyHttpUtilsServer/string.action?content=" + content)
.onExecute(new StringCallBack() {//開始執(zhí)行,并有一個(gè)回調(diào)(異步的哦---->直接可以更新ui)
//此處省略回調(diào)處理
);
}
參數(shù)多的情況怎么搞?加很多addParam()?繼續(xù)往下看
4.2、get請求案例之Ip地址查詢
參數(shù): ip
請求方式: get
返回結(jié)果:
{
"code":0,
"data":{
"country":"中國",
"country_id":"CN",
"area":"華南",
"area_id":"800000",
"region":"廣東省",
"region_id":"440000",
"city":"廣州市",
"city_id":"440100",
"county":"",
"county_id":"-1",
"isp":"騰訊網(wǎng)絡(luò)",
"isp_id":"1000153",
"ip":"182.254.34.74"
}
}
根據(jù)json就可以得到相對應(yīng)的java對象,以前你是手動(dòng)一個(gè)一個(gè)敲上去的嗎?那看看《[android插件篇]如何快速通過json構(gòu)建javabean對象(GsonFormat使用教程)》你就會(huì)如魚得水了(知道的請忽略)。
/**
* 查詢按鈕單擊事件
*
* @param view
*/
public void onQuery(View view) {
mProgressDialog.show();
String ip = etIp.getText().toString().trim();
MyHttpUtils.build()//構(gòu)建myhttputils
.url("http://ip.taobao.com/service/getIpInfo.php")//獲取ip的url
.addParam("ip", ip)//請求參數(shù)
.setJavaBean(IPBean.class)//設(shè)置請求結(jié)果對應(yīng)的java對象
.onExecute(new CommCallback() {
@Override
public void onSucceed(IPBean ipBean) {
showResult(ipBean);
}
@Override
public void onFailed(Throwable throwable) {
ToastUtils.showToast(IPQueryActivity.this, FailedMsgUtils.getErrMsgStr(throwable.getMessage()));
}
});
}
/**
* 顯示結(jié)果
* @param ipBean
*/
private void showResult(IPBean ipBean) {
IPBean.DataBean ipInfo = ipBean.getData();
tvIp.setText(etIp.getText().toString().trim());
tvCountry.setText(ipInfo.getCountry());
tvArea.setText(ipInfo.getArea());
tvCity.setText(ipInfo.getCity());
tvIsp.setText(ipInfo.getIsp());
tvRegion.setText(ipInfo.getRegion());
}
效果:
通過myhttputils配置一些基礎(chǔ)請求的參數(shù)即可完成android中復(fù)雜的網(wǎng)絡(luò)請求,自動(dòng)解析json為對象,即可拿到結(jié)果對應(yīng)的java對象,鏈?zhǔn)降木幊淌沟么a結(jié)構(gòu)清晰的同時(shí)也簡化了網(wǎng)絡(luò)請求過程。
加點(diǎn)反饋效果----顯示進(jìn)度條對話框(可選回調(diào)方法onComplete的應(yīng)用):
/**
* 查詢按鈕單擊事件
*
* @param view
*/
public void onQuery(View view) {
mProgressDialog.show();//點(diǎn)擊的時(shí)候顯示進(jìn)度條
String ip = etIp.getText().toString().trim();
MyHttpUtils.build()//構(gòu)建myhttputils
.url("http://ip.taobao.com/service/getIpInfo.php")//獲取ip的url
.addParam("ip", ip)//請求參數(shù)
.setJavaBean(IPBean.class)//設(shè)置請求結(jié)果對應(yīng)的java對象
.onExecute(new CommCallback() {
@Override
public void onSucceed(IPBean ipBean) {
showResult(ipBean);
}
@Override
public void onFailed(Throwable throwable) {
ToastUtils.showToast(IPQueryActivity.this, FailedMsgUtils.getErrMsgStr(throwable.getMessage()));
}
@Override
public void onComplete() {//完成之后回調(diào)
mProgressDialog.dismiss();//完成之后就關(guān)閉進(jìn)度條
}
});
}
onComplete會(huì)在請求結(jié)束的時(shí)候回調(diào),這樣你可以在接收之后做出相應(yīng)的友好提示,比如這里的關(guān)閉進(jìn)度條;
4.3、Post請求之登錄教程
參數(shù): username(用戶名)、 pwd(密碼)
請求方式: post
返回結(jié)果:
{"response":"succeed","msg":"登錄成功"}
看效果:
上代碼:
/**
* 登錄的單擊事件
*
* @param view
*/
public void onLogin(View view) {
String username = etUserName.getText().toString().trim();//獲取用戶輸入的用戶名
String pwd = etPwd.getText().toString().trim();//獲取用戶輸入的密碼
Map params = new HashMap<>();//構(gòu)造請求的參數(shù)
params.put("username", username);
params.put("pwd", pwd);
MyHttpUtils.build()
.url("http://192.168.2.153:8080/MyHttpUtilsServer/userlogin")
.addParams(params)
.setJavaBean(LoginBean.class)
.onExecuteByPost(new CommCallback() {
@Override
public void onSucceed(LoginBean loginBean) {
ToastUtils.showToast(LoginActivity.this,loginBean.getMsg());
}
@Override
public void onFailed(Throwable throwable) {
ToastUtils.showToast(LoginActivity.this, FailedMsgUtils.getErrMsgStr(throwable));
}
});
}
多個(gè)參數(shù)的情況加建議使用map對象構(gòu)造然后addPatams即可。
4.4 文件下載
**參數(shù):**無
請求方式: get
**返回結(jié)果:**無
代碼:
/**
* 開始下載按鈕單擊事件
*
* @param view
*/
public void onDownload(View view) {
MyHttpUtils.build()
.url("http://192.168.2.153:8080/MyHttpUtilsServer/g3box_uesr_2.3.1.apk")
.setConnTimeOut(6000)//設(shè)置連接超時(shí)時(shí)間[可選,默認(rèn)5s]
.setReadTimeOut(5*60*1000)//設(shè)置讀取超時(shí)時(shí)間[可選,默認(rèn)30s]
.onExecuteDwonload(new CommCallback() {
@Override
public void onSucceed(Object o) {
ToastUtils.showToast(DownloadActivity.this, "下載完成");
}
@Override
public void onFailed(Throwable throwable) {
ToastUtils.showToast(DownloadActivity.this, FailedMsgUtils.getErrMsgStr(throwable));
}
@Override
public void onDownloading(long total, long current) {
System.out.println(total+"-------"+current);
tvProgress.setText(new DecimalFormat("######0.00").format(((double) current / total) * 100)+"%");//保留兩位小數(shù)
}
});
這里引入了setConnTimeOut (設(shè)置連接超時(shí)時(shí)間),由于下載大文件的話比較耗時(shí)讀取時(shí)間是30s可能不夠 所以可以通過setReadTimeOut設(shè)置長時(shí)間,比如5分鐘=5601000【兩個(gè)方法傳入的都是時(shí)間的毫秒值】
溫馨提示: myhttputils模式會(huì)下載文件到sdcard/download目錄下面,如需修改,使用
setFileSaveDir("/sdcard/myapp") 即可
效果圖:
4.5、文件上傳
參數(shù): 無
請求方式: 無
返回結(jié)果: 無
4.5.1、單文件上傳
效果圖:
上代碼:
/**
* 單文件上傳
*
* @param view
*/
public void onUpload(View view) {
mProgressDialog.show();
MyHttpUtils.build()
.uploadUrl("http://192.168.2.153:8080/MyHttpUtilsServer/upload")
.addFile("sdcard/download/wifi.exe")
.onExecuteUpLoad(new CommCallback() {
@Override
public void onComplete() {
mProgressDialog.dismiss();
ToastUtils.showToast(UploadActivity.this,"上傳完成");
}
@Override
public void onSucceed(Object o) {
}
@Override
public void onFailed(Throwable throwable) {
ToastUtils.showToast(UploadActivity.this, FailedMsgUtils.getErrMsgStr(throwable));
}
});
}
**溫馨提示:**添加文件可以通過addFile(文件的絕對路徑)和addFile(new File(文件絕對路徑)),還有就是這里使用uploadUrl而不是url來設(shè)置請求接口哦
4.5.2、多文件上傳
多文件上傳有兩種方式,即addFile多次和addFiles一個(gè)集合,addFile就不演示了,下面演示addFiles
上代碼:
/**
* 多文件上傳
*
* @param view
*/
public void onUploadMult(View view) {
mProgressDialog.show();
Listfiles=new ArrayList<>();
files.add(new File("sdcard/download/wifi.exe"));
files.add(new File("sdcard/download/g3box_uesr_2.3.1.apk"));
MyHttpUtils.build()
.uploadUrl("http://192.168.2.153:8080/MyHttpUtilsServer/upload")
.addFiles(files)
.onExecuteUpLoad(new CommCallback() {
@Override
public void onComplete() {
mProgressDialog.dismiss();
ToastUtils.showToast(UploadActivity.this,"上傳完成");
}
@Override
public void onSucceed(Object o) {
}
@Override
public void onFailed(Throwable throwable) {
ToastUtils.showToast(UploadActivity.this, FailedMsgUtils.getErrMsgStr(throwable));
}
});
}
4.6、參數(shù)與文件同時(shí)上傳
參數(shù): content
請求方式: get
效果:
代碼:
/**
* 參數(shù)與文件同時(shí)上傳
*
* @param view
*/
public void onUploadParamFile(View view) {
MyHttpUtils.build()//構(gòu)建myhttputils
.url("http://192.168.2.153:8080/MyHttpUtilsServer/string.action")//請求的url
.uploadUrl("http://192.168.2.153:8080/MyHttpUtilsServer/upload")
.addParam("content", "abc")
.addFile("sdcard/download/wifi.exe")
.onExecute(new StringCallBack() {//開始執(zhí)行,并有一個(gè)回調(diào)(異步的哦---->直接可以更新ui)
@Override
public void onSucceed(String result) {//請求成功之后會(huì)調(diào)用這個(gè)方法
ToastUtils.showToast(UploadActivity.this, "轉(zhuǎn)換成功-------->" + result);
}
@Override
public void onFailed(Throwable throwable) {//請求失敗的時(shí)候會(huì)調(diào)用這個(gè)方法
ToastUtils.showToast(UploadActivity.this, FailedMsgUtils.getErrMsgStr(throwable));
}
})
.onExecuteUpLoad(new CommCallback() {
@Override
public void onComplete() {
mProgressDialog.dismiss();
ToastUtils.showToast(UploadActivity.this, "上傳完成");
}
@Override
public void onSucceed(Object o) {
}
@Override
public void onFailed(Throwable throwable) {
ToastUtils.showToast(UploadActivity.this, FailedMsgUtils.getErrMsgStr(throwable));
}
});
}
參數(shù)與文件同時(shí)上傳,其實(shí)就是請求的組合
五、使用小技巧
**5.1、日志打印 **
為了方便調(diào)試,myhttputils還會(huì)在logcat中打印i級(jí)別的json字符串日志,如日志太多可添加HttpRequester為過濾條件,看圖(是不是很容易就看出來了):
上面是請求正常的情況下打印,同樣錯(cuò)誤情況下也會(huì)有e級(jí)別日志------->下面這個(gè)是url地址錯(cuò)誤時(shí)的錯(cuò)誤信息
5.2、錯(cuò)誤信息對照表
如果你不想使用myhttputils提供的FailedMsgUtils.getErrMsgStr()方法,你可以自己根據(jù)返回的throwable進(jìn)行處理,下面是myhttputils可能會(huì)截獲的異常對照表:
5.3、關(guān)于請求參數(shù)的配置
如果你覺得在一條鏈上set方法太多不太好,myhttputils還提供了HttpBody方法,先構(gòu)造完了,通過setHttpBody即可。(這種方式需要你自己判斷文件是否存在哦)
下面以上面下載的案例來調(diào)整:
/**
* 開始下載按鈕單擊事件
*
* @param view
*/
public void onDownload(View view) {
HttpBody body = new HttpBody();
body.setUrl("http://192.168.2.153:8080/MyHttpUtilsServer/wifi.exe")
.setConnTimeOut(6000)
.setFileSaveDir("/sdcard/myapp")
.setReadTimeOut(5 * 60 * 1000);
MyHttpUtils.build()
.setHttpBody(body)
.onExecuteDwonload(new CommCallback() {
@Override
public void onSucceed(Object o) {
ToastUtils.showToast(DownloadActivity.this, "下載完成");
}
@Override
public void onFailed(Throwable throwable) {
ToastUtils.showToast(DownloadActivity.this, FailedMsgUtils.getErrMsgStr(throwable));
}
@Override
public void onDownloading(long total, long current) {
System.out.println(total + "-------" + current);
tvProgress.setText(new DecimalFormat("######0.00").format(((double) current / total) * 100) + "%");//保留兩位小數(shù)
}
});
}
最后
如反饋良好,可以考慮詳解源碼,留言告訴我吧
如有bug、新功能建議請留言,我一定以最快的速度回復(fù)。
總結(jié)
以上是生活随笔為你收集整理的java http 异步请求框架_GitHub - huangdali/MyHttpUtils: 一个非常好用的异步网络请求框架...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTML字体小于12谷歌不兼容,Chro
- 下一篇: 与smart_近视激光手术之smart篇