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