当前位置: 代码迷 >> Android >> 初涉RxAndroid组合Glide实现多图片加载操作
  详细解决方案

初涉RxAndroid组合Glide实现多图片加载操作

热度:98   发布时间:2016-04-24 11:31:59.0
初涉RxAndroid结合Glide实现多图片加载操作

转载请注明出处:王亟亟的大牛之路

本来周末就想发了然后各种拖拉就没有然后了,那么就今天早上写吧,废话不多开始正题

什么是RxJava或者RxAndroid我就不多废话了,理论知识一大堆人给我们做好了,只要自己肯去看就能理解,我这里直接给出传送门:https://github.com/lzyzsd/Awesome-RxJava(很丰富,看完就基本有概念了)


那么问题来了,人家都解释完了我干嘛?实操个简单的例子吧,正好上周讲了篇Glide的那么这次就实践下

效果图:

这里写图片描述

我们点开App然后就是一个RecycleView里面有一堆图然后还有文字,文字是本地的,图是网上下的,逻辑流程很简单,来说一下怎么实现的然后引出主角。

包结构:

这里写图片描述

GlideModuleConfig配置Glide
StatusBarCompat沉浸式菜单栏实现(翔哥那扣来的,这个其实可有可无主要默认的颜色太丑)
TestOBJ页面对象的属性模型(你也可以不用,个人习惯)
然后就是业务实现的MainActivity和适配器DataAdapter了

我们一个一个类看先是GlideModuleConfig

/** * Created by jiajiewang on 16/3/25. */public class GlideModuleConfig implements GlideModule {    //在这里创建设置内容,之前文章所提及的图片质量就可以在这里设置    //还可以设置缓存池参数什么的    @Override    public void applyOptions(Context context, GlideBuilder builder) {        //设置了默认图片格式        builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);        //设置了缓存的位置        builder.setDiskCache(new ExternalCacheDiskCacheFactory(context,"MY_CACHE_LOCATION", 100*1024*1024));    }    //在这里注册ModelLoaders    @Override    public void registerComponents(Context context, Glide glide) {    }}

这里做一些配置工作,具体干什么可以看注释

TestOBJ用于给RecycleView引用图片地址和文字内容

public class TestOBJ {    public String imageUrl;    public String content;}

翔哥那个类不解释了,可以自己去搜搜百度第一条就是,我们再来看看适配器

DataAdapter(重要步骤的解释也在注释里了)

public class DataAdapter extends RecyclerView.Adapter {    Context context;    List<TestOBJ> testOBJs;    public DataAdapter(Context context) {        this.context = context;    }    //获取布局    @Override    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);        return new DataViewHolder(view);    }    //具体item的加载图片填充数据    @Override    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {        DataViewHolder dataViewHolder = (DataViewHolder) holder;        TestOBJ obj = testOBJs.get(position);//先获取上下文对象,再加载具体的URL然后填充到控件里去        Glide.with(holder.itemView.getContext()).load(obj.imageUrl).into(dataViewHolder.imageIV);        dataViewHolder.contentTV.setText(obj.content);    }    @Override    public int getItemCount() {        return testOBJs == null ? 0 : testOBJs.size();    }    //控件对象Holder    static class DataViewHolder extends RecyclerView.ViewHolder {        ImageView imageIV;        TextView contentTV;        public DataViewHolder(View itemView) {            super(itemView);            imageIV = (ImageView) itemView.findViewById(R.id.imageIV);            contentTV = (TextView) itemView.findViewById(R.id.contentTV);        }    }    //刷新数据用    public void updateData(List<TestOBJ> testOBJs) {        this.testOBJs = testOBJs;        notifyDataSetChanged();    }}

数据层已经OK了,我们来看看业务层

public class MainActivity extends AppCompatActivity {    Toolbar toolBar;    RecyclerView recycleView;    DataAdapter dataAdapter;    //URL数据源    String data[] = {"http://hiphotos.baidu.com/zhixin/abpic/item/4651a712c8fcc3cea97dbce49045d688d53f206c.jpg"            , "http://pic.5442.com/2014/0930/06/5442.jpg",            "http://img5q.duitang.com/uploads/item/201410/22/20141022214043_5EEKH.thumb.224_0.jpeg",            "http://img5.duitang.com/uploads/item/201512/08/20151208163159_HGEM2.thumb.224_0.png",            "http://img4.duitang.com/uploads/item/201510/29/20151029224537_ijEKF.thumb.224_0.jpeg",            "http://img5.imgtn.bdimg.com/it/u=1230273521,1023320328&fm=21&gp=0.jpg"    };    //被观察者    Observable observable = Observable.create(new Observable.OnSubscribe<List<TestOBJ>>() {        @Override        public void call(Subscriber<? super List<TestOBJ>> subscriber) {            subscriber.onNext(makeData());            subscriber.onCompleted();        }    });    //观察者    Observer<List<TestOBJ>> observer = new Observer<List<TestOBJ>>() {        @Override        public void onCompleted() {            LogUtils.d("--->onCompleted");        }        @Override        public void onError(Throwable e) {            Toast.makeText(MainActivity.this, "加载失败", Toast.LENGTH_SHORT).show();        }        @Override        public void onNext(List<TestOBJ> testOBJs) {            testOBJs.size();            LogUtils.d("--->onNext  testOBJs.size() " + testOBJs.size());            //刷新数据            dataAdapter.updateData(testOBJs);        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        init();        logic();        setSupportActionBar(toolBar);        StatusBarCompat.compat(this, getResources().getColor(R.color.status_bar_color));        StatusBarCompat.compat(this);    }    private void init() {        LogUtils.d("--->init");        toolBar = (Toolbar) findViewById(R.id.toolBar);        recycleView = (RecyclerView) findViewById(R.id.recycleView);        observable.subscribeOn(Schedulers.io())                .observeOn(AndroidSchedulers.mainThread())                .subscribe(observer);    }    private void logic() {        LogUtils.d("--->logic");        dataAdapter = new DataAdapter(MainActivity.this);        recycleView.setLayoutManager(new LinearLayoutManager(MainActivity.this));        recycleView.setAdapter(dataAdapter);        LogUtils.d("--->Glide.getPhotoCacheDir " + Glide.getPhotoCacheDir(MainActivity.this, "MY_CACHE_LOCATION"));    }    //制造数据    private List<TestOBJ> makeData() {        List<TestOBJ> list = new ArrayList<>();        TestOBJ testOBJ;        for (int k = 0; k < 5; k++) {            testOBJ = new TestOBJ();            testOBJ.content = "标题啊,你服不服 " + k + " 个 ";            testOBJ.imageUrl = data[k];            list.add(testOBJ);        }        LogUtils.d("--->list的长度等于 " + list.size());        return list;    }    @Override    protected void onPause() {        super.onPause();        //清除请求        Glide.clear(recycleView);    }    @Override    protected void onDestroy() {        super.onDestroy();        LogUtils.d("--->onDestroy");        //必须主线程使用        Glide.get(this).clearMemory();        //Glide.get(this).clearDiskCache(); 非主线程    }}

解释:
我们定义了一个观察者和一个被观察者然后自从

 observable.subscribeOn(Schedulers.io())                .observeOn(AndroidSchedulers.mainThread())                .subscribe(observer);

注册的行为开始后,只咬被观察者一有风吹草动,观察者的相关回调就会被触发,我们来看下Log的打印顺序
这里写图片描述
还是在一堆的Activity生命周期里先跑在我们数据摸你的过程中看了可能我们Glide缓存的目录,跟我们的预设一致,接着就执行了 onNext再是onCompleted,因为没出什么意外也就没刷出onError

/data/user/0/sample.wjj.rxandroidglidedemo/cache/MY_CACHE_LOCATION

源码地址:https://github.com/ddwhan0123/RxAndroidDemo

3楼mAkerBetter1小时前
楼主是喜欢这个图片的妹子么
2楼HelloJava_happy2小时前
up
1楼heotaeyoung2小时前
帕尼漂亮~