日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java http 异步请求框架_GitHub - huangdali/MyHttpUtils: 一个非常好用的异步网络请求框架...

發(fā)布時(shí)間:2024/8/23 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java http 异步请求框架_GitHub - huangdali/MyHttpUtils: 一个非常好用的异步网络请求框架... 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

輕量級(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。