編輯:關於Android編程
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;
@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結束掉 */
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筆記之:App列表之下拉刷新的使用
Android的ListView是應用最廣的一個組件,功能強大,擴展性靈活(不局限於ListView本身一個類),前面的文章有介紹分組,拖拽,3D立體,游標,圓角,而今天
android:Activity啟動模式之singleTask(一)
先看一下standard啟動模式的說明:只有一個實例,在同一個應用程序中啟動他的時候,若不存在此Activity實例,則會在當前棧頂創建一個新的實例,若存在,則會把棧中在
Android_事件紛發
關於事件你應該知道的是當一個事件產生後,他的傳遞過程遵循如下順序Activity > Window > View事件來源於activity,activity假
android 驗證碼之短信驗證(雲之訊短信平台)
好久沒更新過博客了。這段時間總算是忙完了,抽點時間出來更新下博客。這次跟大家帶來的是一個很簡單的短信驗證碼。相信這個驗證碼的功能基本上99的項目都需要用到,我這裡是用的雲