转载请注意:http://blog.youkuaiyun.com/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();