Android轮播图使用OkGo加载网络图片分别设置

前言:    

    轮播图是一种常用的广告控件,几乎在每个App中都会出现。本文阐述一个之前在开发中遇到的问题,就是使用OkGo异步加载网络图片并分别设置给轮播图;如果方法不好,乐于接受批评!

    一:引入依赖

     依赖有轮播图插件<RollPageView>和OkGo;(我略懒,并没有自己写一个轮播图)

    
compile 'com.jude:rollviewpager:1.4.6'//轮播图
    
compile 'com.lzy.net:okgo:3.0.4'

    二:使用

        布局就不放出来了,文章主要写后台逻辑部分,首先轮播图的创建依赖一个Adapter适配器,我们需要先构建这个适配器。我给他起名叫做AdaverLoadAdapter;

package com.rx.base.adapter;

import android.graphics.Bitmap;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import com.jude.rollviewpager.RollPagerView;
import com.jude.rollviewpager.adapter.LoopPagerAdapter;

import java.util.ArrayList;

import static android.content.ContentValues.TAG;

/**
 * 广告轮播图适配器(传入url)
 * Created by 贾恒飞 on 2017/12/27 0027.
 */

public class AdvertLoadAdapter extends LoopPagerAdapter {
    private ArrayList<String> imgs;
    private Load load;
    private Deploy deploy;

    public AdvertLoadAdapter(RollPagerView viewPager, ArrayList<String> imgs, Load load) {
        super(viewPager);
        this.imgs = imgs;
        this.load = load;
    }

    public AdvertLoadAdapter(RollPagerView viewPager, ArrayList<String> imgs, Deploy deploy) {
        super(viewPager);
        this.imgs = imgs;
        this.deploy = deploy;
    }

    @Override
    public View getView(ViewGroup container, int position) {
        ImageView view = new ImageView(container.getContext());
        if (load != null){
            view.setImageBitmap(load.loadBitmap(load.verifyUrl(imgs.get(position))));//设置每张图片
        }
        if (deploy != null){
            deploy.deployBitmap(view,deploy.verifyUrl(imgs.get(position)));
            Log.d(TAG, "getView: ImageUrl::"+imgs.get(position));
        }
        view.setScaleType(ImageView.ScaleType.CENTER_CROP);
        view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
        return view;
    }

    @Override
    public int getRealCount() {
        return imgs.size();
    }

    //图片下载接口
    public interface Load{
        //判断地址是否正确
        String verifyUrl(String url);
        //网络加载图片
        Bitmap loadBitmap(String url);
    }

    //图片配置接口
    public interface Deploy{
        //判断地址是否正确
        String verifyUrl(String url);
        //网络配置图片
        void deployBitmap(ImageView imageView,String url);
    }
}

        适配器根据不同情况,提供了开启下载通道或者直接设置图片两种方式。如果选择开启下载通道模式,适配器默认提供一个接口,接收返回的BitMap,内部设置给每个Image对象,然而事实证明这个方法是不科学的,因为网络加载的延时性,这种方法只存在与同步中有效;第二种方法是适配器提供的Deploy接口,接口返回所持有的每一个Image对象,并且返回当前Image对象所对应的url,在外部实现图片的加载和设置;

        因为我的这个适配器是封装在baseModel中的,Model中并没有引入任何的网络加载框架,所以把网络加载部分放权给其他层做,本身只负责构建和显示;

        根据这个适配器,我在控制层进行了基本的设置,在model层进行了数据的请求;

        控制层代码:

    控制层代码少的可怜:
@Override
public void initRollViewPage(RollPagerView rollViewPage) {
    AdvertLoadAdapter adapter = new AdvertLoadAdapter(rollViewPage,mRocmmModel.gainRollUrl(),this);
    rollViewPage.setAdapter(adapter);
}
在当前页实现一个接口Deploy
@Override
public String verifyUrl(String url) {
    return url;
}

@Override
public void deployBitmap(ImageView imageView, String url) {
    mRocmmModel.gainRollBitmap(url,imageView);
}
在这里我们暂时不对url做任何处理,如果需要对资源url做加密操作是可以在这里完成解密操作,把加密的字符串解析成正常的字符串然后传递给deployBitmap方法;
        底层请求代码:
@Override
public void gainRollBitmap(String url, final ImageView imageView) {
    Api.net().gainBitMap(url, new BitmapCallback() {
        @Override
        public void onSuccess(Response<Bitmap> response) {
            imageView.setImageBitmap(response.body());
        }
    });
}
    对于OkGo的请求部分,我把它在Api中进行了封装,使得所有数据的存取操作都围绕Api工具类进行,对于本地和网络的区分在于取得是net对象还是dao对象,这样model只关注与对数据的集中处理,Api则负责实际的数据请求和数据查询;

        OkGo请求:

@Override
public void gainBitMap(String url, BitmapCallback bitmapCallback) {
    OkGo.<Bitmap>post(url)
            .retryCount(ApiConfig.retryCount)
            .tag(url)
            .cacheTime(ApiConfig.cacheTime)
            .cacheMode(CacheMode.DEFAULT)
            .execute(bitmapCallback);
}

    
 

猜你喜欢

转载自blog.csdn.net/qq_36676433/article/details/79768653
今日推荐