网上大神写的文章已经很多,我写这个只是想把自己的学习过程记录下来,能看到自己一步步的成长,其实有些东西已经用过了,但很多时候用的是各种封装的,想重新开始了解下,以前用过xutils,volley,到现在用okhttp,发现一入it深似海,需要不断的学习,不然就会跟不上步伐,但是既已选择,就无怨无悔,而且相比于做其他的工作,我还是更喜欢这样状态的自己。
这篇博客写的是okhttp+gson解析的,其中轮播图显示用的是Banner+glide。等后面用到retrofit时便不需要自己解析,也不需要自己去实现子线程到主线程的回调,源码里面已经写好了。
首先在build.gradle中添加依赖,这里的话okio的依赖一定要添加,因为okhttp在io处理时用到了
compile 'com.squareup.okio:okio:1.5.0'
compile 'com.youth.banner:banner:1.4.9'
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'com.squareup.okhttp:okhttp:2.4.0'
在这里用一个get请求的实例来进行讲解,效果如下图,这是是我自己用工具做的,看得有些晃眼
核心代码:
private void getdata() {
//创建okHttpClient对象
OkHttpClient mOkHttpClient = new OkHttpClient();
//创建一个Request
final Request request = new Request.Builder().url("https://baiting.longruncloud.com/api/recommendations").build();
//请求加入调度,异步的方式执行请求
mOkHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
}
@Override
public void onResponse(final Response response) throws IOException {
/**
* 这里成功代表的是http返回成功,也就是若返回404、405之类的错误也会回调到这里
* 所以我们需要自己判断服务端返回码,一般返回200是成功处理了请求
*/
if (response.code() == 200) {
final String res = response.body().string();
RecommendationBean recommendationBean = gson.fromJson(res, RecommendationBean.class);
carousels = recommendationBean.getCarousels();
/**
* 因为Android 的网络请求必须在非主线程,而视图的更新必须在主线程
* 所以必须有子线程回调主线程这样一个操作,而okhttp没有添加任何关于Android的代码
* 这样可以使得okhttp可以应用于任何地点而单独存在
* 但是在Android中就变成必须要自己去实现子线程到主线程的回调
* 也就是在执行异步请求之后,得到数据时我们又要使用runOnUiThread更新ui(设置界面)
*/
runOnUiThread(new Runnable() {
@Override
public void run() {
//增强for循环添加图片路径
for (RecommendationBean.CarouselsBean element : carousels) {
String image = element.getImage();
images.add(image);
}
//Banner图片加载,支持手势滑动,支持首尾循环
banner.setImageLoader(new GlideImageLoader());
// 设置图片集合
banner.setImages(images);
//banner设置方法全部调用完毕时最后调用
banner.start();
}
});
}
}
});
}
注释的已经很详细,相信大家都能看懂,后面三行是加载轮播图的,以前用imageloader的时候还挺麻烦的。其中需要用到的GlideImageLoader类和布局文件我也贴出来:
public class GlideImageLoader extends ImageLoader {
@Override
public void displayImage(Context context, Object path, ImageView imageView) {
/**
图片加载方式由自己选择,我用的是glide
*/
Glide.with(context).load(path).into(imageView);
}
}
<com.youth.banner.Banner
android:id="@+id/banner"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
实体类的话大家可以在网页上打开url,然后复制内容用studio自带的gsonformat就可以创建。到此一个完整的网络请求就完成了。
另外附上Post请求代码:
OkHttpClient mOkHttpClient = new OkHttpClient();
FormEncodingBuilder builder = new FormEncodingBuilder();
builder.add("username", "okhttp");//有几个参数add几个
Request request = new Request.Builder()
.url("url地址")
.post(builder.build())
.build();
mOkHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
}
@Override
public void onResponse(Response response) throws IOException {
Log.e("Post---response", response + "");
//与get请求一样,若涉及到回调主线程,都需要通过runOnUiThread或者handler更新ui
}
});
希望能和各位共同进步~