Android雜談(14)OKHttp+Gson的簡單使用
轉載請注意:http://blog.csdn.net/wjzj000/article/details/52562674
本菜GitHub上開源了一個小的Android專案,感興趣的看官大大們可以star下:
https://github.com/zhiaixinyang/MyFirstApp
我和一幫應屆生同學維護了一個公眾號:IT面試填坑小分隊。旨在幫助應屆生從學生過度到開發者,並且每週樹立學習目標,一同進步!
伺服器綁定了域名
因此以前URL前面部分:http://120.27.4.196:8080/
需要更換成http://www.ohonor.xyz/
今天本來是打算記錄一下Retrofit整了半天沒搞懂,所以先擱一擱。今天記錄一下OKHttp這個網路框架,以及使用Gson快速解析伺服器返回的json資料。
首先是grable中依賴:
compile 'com.squareup.okhttp:okhttp:2.7.0'
compile 'com.google.code.gson:gson:2.7'
接下來就是貼程式碼
(這個url可以直接測試用,部署到我的阿里雲上的。)
private String url="http://120.27.4.196:8080/test/servlet/ShowServlet";
btn_net.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //建立okHttpClient物件 OkHttpClient mOkHttpClient = new OkHttpClient(); //建立一個Request final Request request = new Request.Builder() .url(url) .build(); //new call Call call = mOkHttpClient.newCall(request); //請求加入排程 call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException {
String jsonStr=response.body().string(); Gson gson=new Gson(); Type lt=new TypeToken<List<WS>>(){}.getType(); List<WS> ws=gson.fromJson(jsonStr, lt); Log.d("AAA","溼度:"+ws.get(0).getHumidity()); } }); } });
OKHttp的過程就是,先new一個OKHttpClient,然後通過建造者模式傳入url構建出請求物件Request。
然後通過OKHttpClient.newCall()傳入request,這個方法返回一個Call物件。
最後通過call執行網路請求,其中.enqueue()意味非同步請求,.execute()為主執行緒請求.......
最重要的一點,這種寫法是GET請求。(GET也可以上傳引數,只不過引數是按一定規則拼接在url上的。而POST則是構建一個特定類,放在請求的正文之中。)
POST引數用法:
private String postSend="http://120.27.4.196:8080/test/servlet/SendServlet";
private void postTest(String username,String password){
OkHttpClient client=new OkHttpClient();
RequestBody formBody = new FormEncodingBuilder()
.add("username", username)
.add("password", password)
.build();
Request request = new Request.Builder()
.url(postSend)
.post(formBody)
.build();
//new call
Call call = client.newCall(request);
//請求加入排程
call.enqueue(new Callback()
{
@Override
public void onFailure(Request request, IOException e) {}
@Override
public void onResponse(final Response response) throws IOException
{
Log.d("aaa","請求到的資料:" + response.body().string());
}
});
}
這裡重點來記一記關於Gson的一些使用:
首先如果json格式為陣列時那麼在gson.fromJson這個方法中傳遞的值要封裝成Type型別。
如果json為物件那麼就可以直接傳入正常的bean物件了。
其次bean中的物件的屬性必須對應json裡的值,也就是命名二者必須一樣,至於需不需要構造方法,比不是必要的。
這裡是伺服器返回的json格式[{"temperature":"111","humidity":"222"}],而bean裡的WS同樣是
private String temperature;
private String humidity;
如果是這樣{"temperature":"111","humidity":"222"},直接new Gson().fromJson(jsonStr,WS.class)即會返回WS類。
命名必須一致。
16年12月4日補充:
OkHttpClient的初始化,通過Builder設計模式進行一些設定資訊的裝填。
OkHttpClient.Builder builder=new OkHttpClient.Builder();
File cacheFile=new File(Constants.PATH_CACHE);
//設定快取為50m
Cache cache=new Cache(cacheFile,1024*1024*50);
Interceptor cacheInterceptor=new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
if (!NetUtil.isNetworkAvailable()) {
request = request.newBuilder()
.cacheControl(CacheControl.FORCE_CACHE)
.build();
}
Response response = chain.proceed(request);
if (NetUtil.isNetworkAvailable()) {
int maxAge = 0;
// 有網路時, 不快取, 最大儲存時長為0
response.newBuilder()
.header("Cache-Control", "public, max-age=" + maxAge)
.removeHeader("Pragma")
.build();
} else {
// 無網路時,設定超時為4周
int maxStale = 60 * 60 * 24 * 28;
response.newBuilder()
.header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale)
.removeHeader("Pragma")
.build();
}
return response;
}
};
//設定快取
builder.addNetworkInterceptor(cacheInterceptor);
builder.addInterceptor(cacheInterceptor);
builder.cache(cache);
//設定超時
builder.connectTimeout(10, TimeUnit.SECONDS);
builder.readTimeout(10, TimeUnit.SECONDS);
builder.writeTimeout(10, TimeUnit.SECONDS);
//錯誤重連
builder.retryOnConnectionFailure(true);
okHttpClient = builder.build();