RxJava——基础学习(三),简单实践

作者: 英勇青铜5 | 来源:发表于2016-08-18 14:36 被阅读440次

    RxJava——基础学习(一)
    RxJava——基础学习(二)
    前两篇基础学习,了解了RxJava最基础的部分知识。这一篇,就根据前两篇学习到的,进行一个简单的实践,加载手机相册中所有的图片。

    运行图

    1.首先说明

    本篇主要是记录RxJava的使用。

    我手机里只有45张图片,图片小的100多k,大的3M左右,我的手机图片少,目前是没有啥问题。一旦图片多了,也不清楚会不会滑动过程卡顿或者OOM。

    加载图片用的Glide。


    2.代码

    Demo是采用了MVP的模式。

    2.1利用RxJava来获取手机中所有图片路径的集合

    直接贴代码:

    public class MainModel implements MainContract.MainBiz {
       @Override
        public void loadPic(final Activity activity, final onLoadPicListener onLoadPicListener) {
            Observable
                    .just("image/jpeg,image/png")//图片的格式
                    .filter(new Func1<String, Boolean>() {//在查找前 先判断存储卡是否可以用
                        @Override
                        public Boolean call(String s) {
                            if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
                                return true;
                            } else {
                                onLoadPicListener.onFailed("存储卡不可以用");
                                return false;
                            }
                        }
                    })
                    .subscribeOn(Schedulers.io())
                    .doOnSubscribe(new Action0() {
                        @Override
                        public void call() {//显示SwipeRefreshLayout的圆圈
                            onLoadPicListener.onLoadBefore();
                        }
                    })
                    .subscribeOn(AndroidSchedulers.mainThread())
                    .map(new Func1<String, List<String>>() {
                        @Override
                        public List<String> call(String type) {//拿到图片路径的集合
                            return getPngAndJpgList(activity, type);
                        }
                    })
                    .observeOn(AndroidSchedulers.mainThread())
                    .doOnCompleted(new Action0() {
                        @Override
                        public void call() {//关闭SwipeRefreshLayout的圆圈
                            onLoadPicListener.onLoadAfter();
                        }
                    })
                    .subscribe(new Action1<List<String>>() {
                        @Override
                        public void call(List<String> picPathList) {//将拿到的路径集合进行回调
                            onLoadPicListener.onResult(picPathList);
                        }
                    });
        }
    
        private List<String> getPngAndJpgList(Activity activity, String type) {
            List<String> list = new ArrayList<>();
            Uri imgUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
            ContentResolver contentResolver = activity.getContentResolver();
    
            //查找类型
            String[] types = type.split(",");
            String selection = MediaStore.Images.Media.MIME_TYPE + "=? or "
                    + MediaStore.Images.Media.MIME_TYPE + "=?";
            //得到Cursor
            Cursor cursor = contentResolver.query(imgUri, null, selection, types, MediaStore.Images.Media.DATE_MODIFIED);
            while (cursor.moveToNext()) {
                // 拿到每个图片的路径
                String picPath = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
                list.add(picPath);
            }
            cursor.close();
            //将集合倒序
            Collections.reverse(list);
            return list;
        }
    }
    
    

    主要是学习doOnSubscribe()subscribeOn()observeOn()doOnCompleted()这几个方法的使用。

    上篇中已经说过,doOnSubscribe()受离最近的subscribeOn()的方法控制。
    doOnCompleted()这个方法等同于onCompleted()。在完成时的回调。

    2.2Activity的代码

    public class MainActivity extends AppCompatActivity implements MainContract.View {
        private MainContract.Presenter presenter;
        private RecyclerView recyclerView;
        private SwipeRefreshLayout swipeRefreshLayout;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            init();
        }
        //初始化
        private void init() {
            swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.srl_main_activity);
            swipeRefreshLayout.setColorSchemeColors(Color.RED);
            swipeRefreshLayout.setEnabled(false);//禁止下拉刷新
    
            recyclerView = (RecyclerView) findViewById(R.id.rv_main_activity);
    
            MainPresenter.newInstance(this);
    
            if (presenter != null) presenter.load(MainActivity.this);
        }
    
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            if (presenter != null) presenter.recycle();
            if (recyclerView != null) recyclerView.setAdapter(null);
        }
    
        //显示SwipeRefreshLayout的圆圈
        @Override
        public void showProgress() {
            if (swipeRefreshLayout != null) {
                swipeRefreshLayout.post(new Runnable() {
                    @Override
                    public void run() {
                        swipeRefreshLayout.setRefreshing(true);
                    }
                });
            }
        }
       //关闭SwipeRefreshLayout的圆圈
        @Override
        public void closeProgress() {
            if (swipeRefreshLayout != null && swipeRefreshLayout.isRefreshing()) {
                swipeRefreshLayout.setRefreshing(false);
            }
        }
    
        @Override
        public void showInfo(String info) {
            ToastUtils.show(MainActivity.this, info);
        }
    
        @Override
        public void bindPresenter(MainContract.Presenter presenter) {
            this.presenter = presenter;
        }
    
        @Override
        public void initView() {
            if (presenter != null && recyclerView != null)
                presenter.getRecyclerView(recyclerView);
        }
    }
    
    

    Activity的代码也比较简单,主要就是控件的初始化和实现View层的接口回调方法。

    3.最后

    RxJava有大量的操作符,网上往往看到操作符下会有一个宝石图,目前我看不大懂宝石图。看懂宝石图可以帮助学习理解操作符。: )

    整个Demo的代码:PicStore

    一个学习资料:Piasy大神的SubscribeOn 和 ObserveOn,Piasy大神的博客,全部干货,强烈推荐学习

    下篇记录学习操作符

    共勉。

    相关文章

      网友评论

        本文标题:RxJava——基础学习(三),简单实践

        本文链接:https://www.haomeiwen.com/subject/lruvsttx.html