詳解Android的OkHttp包編寫異步HTTP請求調(diào)用的方法
OkHttp 除了支持常用的同步 HTTP 請求之外,還支持異步 HTTP 請求調(diào)用。在使用同步調(diào)用時,當(dāng)前線程會被阻塞,直到 HTTP 請求完成。當(dāng)同時發(fā)出多個 HTTP 請求時,同步調(diào)用的性能會比較差。這個時候通過異步調(diào)用可以提高整體的性能。
在通過 newCall 方法創(chuàng)建一個新的 Call 對象之后,不是通過 execute 方法來同步執(zhí)行,而是通過 enqueue 方法來添加到執(zhí)行隊(duì)列中。在調(diào)用 enqueue 方法時需要提供一個 Callback 接口的實(shí)現(xiàn)。在 Callback 接口實(shí)現(xiàn)中,通過 onResponse 和 onFailure 方法來處理響應(yīng)和進(jìn)行錯誤處理。
異步調(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ù)器端錯誤: " + response); } System.out.println(response.body().string()); } }); } }
覺得okHttp最難寫的地方應(yīng)該就是Callback了。
相信很多人都會遇到,如果Callback回來之后,我的Activity finish了,或是我的Fragment replace了。
此時更改UI,就會產(chǎn)生找不到View的問題。
而且Callback回來,居然是在backgroundThread上,
這時候如果要操作View又要切換到mainThread去,略顯麻煩。
所以我在寫的時候,是沒有使用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請求的方法
- Android使用OkHttp發(fā)送post請求
- Android小知識之OkHttp的2種請求方式詳解
- Android Okhttp請求查詢購物車的實(shí)例代碼
- Android使用OkHttp請求自簽名的https網(wǎng)站的示例
- Android基于OkHttpUtils網(wǎng)絡(luò)請求的二次封裝
- 詳解Android中使用OkHttp發(fā)送HTTP的post請求的方法
- Android M(6.x)使用OkHttp包解析和發(fā)送JSON請求的教程
- android實(shí)現(xiàn)okHttp的get和post請求的簡單封裝與使用
相關(guān)文章
Android之RecyclerView輕松實(shí)現(xiàn)下拉刷新和加載更多示例
本篇文章主要介紹了Android之RecyclerView輕松實(shí)現(xiàn)下拉刷新和加載更多示例,非常具有實(shí)用價值,需要的朋友可以參考下。2017-02-02Android實(shí)現(xiàn)網(wǎng)絡(luò)圖片瀏覽器
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)網(wǎng)絡(luò)圖片瀏覽器的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下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爬坑之旅,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-12-12android監(jiān)控sim卡有沒有服務(wù)示例(sim卡管理)
android監(jiān)聽SIM卡有沒有服務(wù),可以使用android.telephony.PhoneStateListener類來實(shí)現(xiàn),下面是一個簡單的小例子,大家參考使用吧2014-01-01Flutter實(shí)現(xiàn)底部和頂部導(dǎo)航欄
這篇文章主要為大家詳細(xì)介紹了Flutter實(shí)現(xiàn)底部和頂部導(dǎo)航欄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-07-07Android Wifi的forget()操作實(shí)例詳解
這篇文章主要介紹了Android Wifi的forget()操作實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-02-02Android UI控件ExpandableListView基本用法詳解
這篇文章主要為大家詳細(xì)介紹了Android UI控件ExpandableListView基本用法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-09-09Android Studio實(shí)現(xiàn)簡單計(jì)算器功能
這篇文章主要為大家詳細(xì)介紹了Android Studio實(shí)現(xiàn)簡單計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-03-03