OkHttp 除了支持常用的同步 HTTP 請求之外,還支持異步 HTTP 請求調用。在使用同步調用時,當前線程會被阻塞,直到 HTTP 請求完成。當同時發出多個 HTTP 請求時,同步調用的性能會比較差。這個時候通過異步調用可以提高整體的性能。
在通過 newCall 方法創建一個新的 Call 對象之后,不是通過 execute 方法來同步執行,而是通過 enqueue 方法來添加到執行隊列中。在調用 enqueue 方法時需要提供一個 Callback 接口的實現。在 Callback 接口實現中,通過 onResponse 和 onFailure 方法來處理響應和進行錯誤處理。
異步調用的示例
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("服務器端錯誤: " + response); } System.out.println(response.body().string()); }}); }}覺得okHttp最難寫的地方應該就是Callback了。
相信很多人都會遇到,如果Callback回來之后,我的Activity finish了,或是我的Fragment replace了。
此時更改UI,就會產生找不到View的問題。
而且Callback回來,居然是在backgroundThread上,
這時候如果要操作View又要切換到mainThread去,略顯麻煩。
所以我在寫的時候,是沒有使用Callback的 以下提供一種漂亮(自認...)的寫法給大家做參考。
/* 以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;@Overridepublic 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);}@Overridepublic void onViewCreated(View view, @Nullable Bundle savedInstanceState) { /* start */ backgroundHandler.sendEmptyMessage(MSG_QUERY_DATA);}@Overridepublic void onDestroyView() { /*
主站蜘蛛池模板:
始兴县|
绥芬河市|
鹤庆县|
会泽县|
大足县|
宜昌市|
万安县|
柯坪县|
盐城市|
彰武县|
金塔县|
封丘县|
通海县|
衡阳市|
晴隆县|
永善县|
大关县|
阿荣旗|
富蕴县|
泗洪县|
遂宁市|
江都市|
西峡县|
兰坪|
通榆县|
固原市|
邢台县|
许昌县|
沙坪坝区|
永春县|
通州市|
巴林左旗|
玛曲县|
黔江区|
靖州|
筠连县|
雅江县|
嘉峪关市|
富阳市|
盖州市|
南涧|