詳解Android的OkHttp包編寫異步HTTP請(qǐng)求調(diào)用的方法
OkHttp 除了支持常用的同步 HTTP 請(qǐng)求之外,還支持異步 HTTP 請(qǐng)求調(diào)用。在使用同步調(diào)用時(shí),當(dāng)前線程會(huì)被阻塞,直到 HTTP 請(qǐng)求完成。當(dāng)同時(shí)發(fā)出多個(gè) HTTP 請(qǐng)求時(shí),同步調(diào)用的性能會(huì)比較差。這個(gè)時(shí)候通過異步調(diào)用可以提高整體的性能。
在通過 newCall 方法創(chuàng)建一個(gè)新的 Call 對(duì)象之后,不是通過 execute 方法來同步執(zhí)行,而是通過 enqueue 方法來添加到執(zhí)行隊(duì)列中。在調(diào)用 enqueue 方法時(shí)需要提供一個(gè) Callback 接口的實(shí)現(xiàn)。在 Callback 接口實(shí)現(xiàn)中,通過 onResponse 和 onFailure 方法來處理響應(yīng)和進(jìn)行錯(cuò)誤處理。
異步調(diào)用的示例
public class AsyncGet {
public static void main(String[] args) throws IOException {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("http://www.baidu.com")
.build();
client.newCall(request).enqueue(new Callback() {
public void onFailure(Request request, IOException e) {
e.printStackTrace();
}
public void onResponse(Response response) throws IOException {
if (!response.isSuccessful()) {
throw new IOException("服務(wù)器端錯(cuò)誤: " + response);
}
System.out.println(response.body().string());
}
});
}
}
覺得okHttp最難寫的地方應(yīng)該就是Callback了。
相信很多人都會(huì)遇到,如果Callback回來之后,我的Activity finish了,或是我的Fragment replace了。
此時(shí)更改UI,就會(huì)產(chǎn)生找不到View的問題。
而且Callback回來,居然是在backgroundThread上,
這時(shí)候如果要操作View又要切換到mainThread去,略顯麻煩。
所以我在寫的時(shí)候,是沒有使用Callback的 以下提供一種漂亮(自認(rèn)...)的寫法給大家做參考。
/* 以fragment為例 */
public class BaseFragment extends Fragment implements Handler.Callback {
private static final int MSG_QUERY_DATA = 0x00;
private static final int MSG_DISPLAY_DATA = 0x01;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
this.activity = activity;
/* setup handler */
HandlerThread handlerThread = new HandlerThread(getClass().getName());
handlerThread.start();
backgroundHandler = new Handler(handlerThread.getLooper(), this);
uiHandler = new Handler(activity.getMainLooper(), this);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
/* start */
backgroundHandler.sendEmptyMessage(MSG_QUERY_DATA);
}
@Override
public void onDestroyView() {
/* 將Message清空,backgroundThread結(jié)束掉 */
backgroundHandler.removeCallbacksAndMessages(null);
uiHandler.removeCallbacksAndMessages(null);
backgroundHandler.getLooper().quit();
super.onDestroyView();
}
@Override
public boolean handleMessage(Message msg) {
/* 如果fragment不在Activity上了,直接return掉,避免NPE */
if (!isAdded()) return false;
/* 做各種MSG */
switch(msg.what){
case MSG_QUERY_DATA:
// do okHttp without callback
Response response = client.newCall(request).execute();
// 傳回 uiThread 做UI更新
Message respMsg = uiHandler.obtainMessage();
respMsg.what = MSG_DISPLAY_DATA;
respMsg.obj = response;
backgroundHandler.sendMessage(respMsg);
break;
case MSG_DISPLAY_DATA:
Response apiResponse = (Response)msg.obj;
// 失敗
if(null == apiResponse){
//show error
}
// 成功
else{
//display data on UI
}
break;
return false;
}
}
- Android中使用OkHttp包處理HTTP的get和post請(qǐng)求的方法
- Android使用OkHttp發(fā)送post請(qǐng)求
- Android小知識(shí)之OkHttp的2種請(qǐng)求方式詳解
- Android Okhttp請(qǐng)求查詢購物車的實(shí)例代碼
- Android使用OkHttp請(qǐng)求自簽名的https網(wǎng)站的示例
- Android基于OkHttpUtils網(wǎng)絡(luò)請(qǐng)求的二次封裝
- 詳解Android中使用OkHttp發(fā)送HTTP的post請(qǐng)求的方法
- Android M(6.x)使用OkHttp包解析和發(fā)送JSON請(qǐng)求的教程
- android實(shí)現(xiàn)okHttp的get和post請(qǐng)求的簡(jiǎn)單封裝與使用
相關(guān)文章
Android之RecyclerView輕松實(shí)現(xiàn)下拉刷新和加載更多示例
本篇文章主要介紹了Android之RecyclerView輕松實(shí)現(xiàn)下拉刷新和加載更多示例,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2017-02-02
Android實(shí)現(xiàn)網(wǎng)絡(luò)圖片瀏覽器
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)網(wǎng)絡(luò)圖片瀏覽器的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
Android中ActionBar以及menu的代碼設(shè)置樣式
這篇文章主要介紹了Android中ActionBar以及menu的代碼設(shè)置樣式的相關(guān)資料,需要的朋友可以參考下2015-07-07
詳解AndroidStudio JNI +Gradle3.0以上JNI爬坑之旅
這篇文章主要介紹了詳解AndroidStudio JNI +Gradle3.0以上JNI爬坑之旅,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12
android監(jiān)控sim卡有沒有服務(wù)示例(sim卡管理)
android監(jiān)聽SIM卡有沒有服務(wù),可以使用android.telephony.PhoneStateListener類來實(shí)現(xiàn),下面是一個(gè)簡(jiǎn)單的小例子,大家參考使用吧2014-01-01
Flutter實(shí)現(xiàn)底部和頂部導(dǎo)航欄
這篇文章主要為大家詳細(xì)介紹了Flutter實(shí)現(xiàn)底部和頂部導(dǎo)航欄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07
Android Wifi的forget()操作實(shí)例詳解
這篇文章主要介紹了Android Wifi的forget()操作實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-02-02
Android UI控件ExpandableListView基本用法詳解
這篇文章主要為大家詳細(xì)介紹了Android UI控件ExpandableListView基本用法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09
Android Studio實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能
這篇文章主要為大家詳細(xì)介紹了Android Studio實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03

