zoukankan      html  css  js  c++  java
  • 初涉RxAndroid结合Glide实现多图片载入操作

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

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

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


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

    效果图:

    这里写图片描写叙述

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

    包结构:

    这里写图片描写叙述

    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

  • 相关阅读:
    Think 框架漏洞利用
    提权篇之简单介绍和exp利用过程
    webshell提权20种思路
    黑吃黑,大神实操带你破解菠菜平台
    知道这20个正则表达式,能让你少写1,000行代码
    Spring与Quartz的整合实现定时任务调度
    关于MySQL的wait_timeout连接超时问题报错解决方案
    SpringMVC 400 Bad Request 问题
    java 细说String
    最详细的Log4j使用教程
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/7351101.html
Copyright © 2011-2022 走看看