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

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

希望能和各位共同进步~

                                                                                                    


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值