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

 

 

 

 

 

 

 

 

 

 

 

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值