1. 程式人生 > >Android雜談(14)OKHttp+Gson的簡單使用

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();