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

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大神的博客,全部干货,强烈推荐学习

下篇记录学习操作符

共勉。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,158评论 4 370
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,600评论 1 307
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,785评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,655评论 0 220
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,075评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,002评论 1 225
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,146评论 2 318
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,918评论 0 211
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,671评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,838评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,318评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,636评论 3 263
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,343评论 3 244
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,187评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,982评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,126评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,934评论 2 279

推荐阅读更多精彩内容