詳解Android的OkHttp包編寫(xiě)異步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í)候通過(guò)異步調(diào)用可以提高整體的性能。
在通過(guò) newCall 方法創(chuàng)建一個(gè)新的 Call 對(duì)象之后,不是通過(guò) execute 方法來(lái)同步執(zhí)行,而是通過(guò) enqueue 方法來(lái)添加到執(zhí)行隊(duì)列中。在調(diào)用 enqueue 方法時(shí)需要提供一個(gè) Callback 接口的實(shí)現(xiàn)。在 Callback 接口實(shí)現(xiàn)中,通過(guò) onResponse 和 onFailure 方法來(lái)處理響應(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()); } }); } }
覺(jué)得okHttp最難寫(xiě)的地方應(yīng)該就是Callback了。
相信很多人都會(huì)遇到,如果Callback回來(lái)之后,我的Activity finish了,或是我的Fragment replace了。
此時(shí)更改UI,就會(huì)產(chǎn)生找不到View的問(wèn)題。
而且Callback回來(lái),居然是在backgroundThread上,
這時(shí)候如果要操作View又要切換到mainThread去,略顯麻煩。
所以我在寫(xiě)的時(shí)候,是沒(méi)有使用Callback的 以下提供一種漂亮(自認(rèn)...)的寫(xiě)法給大家做參考。
/* 以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)求查詢購(gòu)物車(chē)的實(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-02Android實(shí)現(xiàn)網(wǎng)絡(luò)圖片瀏覽器
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)網(wǎng)絡(luò)圖片瀏覽器的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05Android中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-12android監(jiān)控sim卡有沒(méi)有服務(wù)示例(sim卡管理)
android監(jiān)聽(tīng)SIM卡有沒(méi)有服務(wù),可以使用android.telephony.PhoneStateListener類來(lái)實(shí)現(xiàn),下面是一個(gè)簡(jiǎn)單的小例子,大家參考使用吧2014-01-01Flutter實(shí)現(xiàn)底部和頂部導(dǎo)航欄
這篇文章主要為大家詳細(xì)介紹了Flutter實(shí)現(xiàn)底部和頂部導(dǎo)航欄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07Android Wifi的forget()操作實(shí)例詳解
這篇文章主要介紹了Android Wifi的forget()操作實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-02-02Android UI控件ExpandableListView基本用法詳解
這篇文章主要為大家詳細(xì)介紹了Android UI控件ExpandableListView基本用法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09Android Studio實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能
這篇文章主要為大家詳細(xì)介紹了Android Studio實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03