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大神的博客,全部干货,强烈推荐学习
下篇记录学习操作符
共勉。