okhttp获取网络数据之轮播图效果实现

来源:互联网 发布:软件系统设计方案 编辑:程序博客网 时间:2024/06/08 14:47

网上大神写的文章已经很多,我写这个只是想把自己的学习过程记录下来,能看到自己一步步的成长,其实有些东西已经用过了,但很多时候用的是各种封装的,想重新开始了解下,以前用过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    }});

希望能和各位共同进步~