Android知识首页投稿(暂停使用,暂停投稿)Android技术知识

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

2016-08-18  本文已影响440人  英勇青铜5

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

下篇记录学习操作符

共勉。

上一篇 下一篇

猜你喜欢

热点阅读