最近比較火的是OKhttp+picasso解析混合使用
接下來我們先上Okhttp抓抓數據。
顯然Okhttp裏面的那個onResponse 和 onFailure是非UI線程,那麼我們改變他的話只有發送個通知出來讓其他的UI線程來處理UI變化了,這個時候,屌絲王Handler出場了。
1.okhttp的get請求封裝
直接上代碼:
public static final int ok_error = -1;
public static final int ok_success = 1;
/**
* okhttp Post請求方式
*/
public static void OKdoGet(String url, final Handler handler) {
OkHttpClient client = new OkHttpClient();
final Request request = new Request.Builder().url(url).build();
// new call
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
handler.sendEmptyMessage(ok_error);
}
@Override
public void onResponse(final Response response) throws IOException {
String resultStr = response.body().string();
Message msg = new Message();
msg.what = ok_success;
msg.obj = resultStr;
handler.sendMessage(msg);
}
});
}
至於Handler裏面怎麼拿自行腦補。
2.Okhttp的post請求封裝
/**
* Post請求的封裝
*/
public static void OKdoPost(String url, final Handler handler,
FormEncodingBuilder builder) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(url).post(builder.build())
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Request arg0, IOException arg1) {
handler.sendEmptyMessage(ok_error);
}
@Override
public void onResponse(Response arg0) throws IOException {
String resultStr = arg0.body().string();
Message msg = new Message();
msg.what = ok_success;
msg.obj = resultStr;
handler.sendMessage(msg);
}
});
}
/**
* Post請求的封裝
*/
public static void OKdoPostWithCode(String url, final Handler handler,
FormEncodingBuilder builder, final int success, final int error) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(url).post(builder.build())
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Request arg0, IOException arg1) {
handler.sendEmptyMessage(error);
}
@Override
public void onResponse(Response arg0) throws IOException {
String resultStr = arg0.body().string();
Message msg = new Message();
msg.what = success;
msg.obj = resultStr;
handler.sendMessage(msg);
}
});
}
因爲他傳值是不定的,所以咱把FormEncodingBuilder 給抽出來另外加,這樣想怎麼傳就怎麼傳,再者不知道他是成功還是失敗,所以就弄了多的兩個判斷的。
3.post請求的參數方法
/**
* post請求
*/
FormEncodingBuilder builder = new FormEncodingBuilder();
builder.add("sj_id", "1");
builder.add("xx", "1");
builder.add("page", page + "");
builder.add("oauth_token", "f5fbefc2bd9f538c3010fd24f57eb536");
OkHttpUtil.OKdoPost(ContextUrl.url, handler, builder);//Post請求方法調用
/**
* post請求 帶請求碼
*/
FormEncodingBuilder builder = new FormEncodingBuilder();
builder.add("sj_id", "1");
builder.add("xx", "1");
builder.add("page", page + "");
builder.add("oauth_token", "f5fbefc2bd9f538c3010fd24f57eb536");
OkHttpUtil.OKdoPostWithCode(ContextUrl.url, handler, builder, 3, 4);
4.超時操作
現在問題來了,很多時候網絡訪問的時候會存在各種超時延遲操作,像HttpUrlconnection裏面的設置超時操作。那麼我們的OKHTTP也是需要設置超時操作的,沒有響應時使用超時結束call。沒有響應的原因可能是客戶點鏈接問題、服務器可用性問題或者這之間的其他東西。OkHttp支持連接,讀取和寫入超時。下面看代碼:
private final OkHttpClient client;
public ConfigureTimeouts() throws Exception {
client = new OkHttpClient();
//設置連接超時
client.setConnectTimeout(10, TimeUnit.SECONDS);
//設置寫入超時
client.setWriteTimeout(10, TimeUnit.SECONDS);
//設置讀取超時
client.setReadTimeout(30, TimeUnit.SECONDS);
}
public void run() throws Exception {
Request request = new Request.Builder().url("http://www.baidu.com") // This URL is served with a 2 second delay.
.build();
Response response=client.newCall(request).execute();
System.out.println("Response completed: " + response);
}
OKhttp暫時說到這裏,有啥加的再上。