您的位置:首页 > 理论基础 > 计算机网络

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

2018-03-31 14:34 696 查看

前言:    

    轮播图是一种常用的广告控件,几乎在每个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);
}
   
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息