Android开发:将AppModel列表生成方法转为RxJava Observable的疑问
如何将AppModel列表生成方法转为RxJava Observable?
看起来你已经摸到RxJava的门儿了,只是在转换逻辑和返回类型上卡壳了,我来帮你理清楚两种选择和对应的实现方式:
首先先明确两种返回类型的核心区别:
- Observable
:这是RxJava流式处理的典型用法,会逐个发射每个转换后的AppModel对象。下游订阅者可以拿到一个就处理一个(比如每生成一个AppModel就更新UI列表的一项),能充分利用RxJava的异步流式特性。 - Observable<ArrayList
> :这种方式会一次性发射整个AppModel列表,和你原来的方法逻辑更接近,但相当于把RxJava当成了单纯的异步工具,没用到它逐个处理元素的优势。
推荐实现:返回Observable
你之前用了doOnNext,但这个操作符是用来处理副作用(比如打日志、缓存)的,不能用来转换元素类型。真正用来做类型转换的是map操作符,直接把ApplicationInfo转换成AppModel,代码如下:
public Observable<AppModel> getMyAppList(PackageManager pm, List<ApplicationInfo> list) { // RxJava 2及以上用fromIterable,RxJava 1用Observable.from(list) return Observable.fromIterable(list) // 加载App标签和图标属于IO操作,用Schedulers.io()比computation更合适 .subscribeOn(Schedulers.io()) .map(applicationInfo -> { AppModel mm = new AppModel(); mm.set_id(applicationInfo.hashCode()); // 用String.valueOf替代""+,更规范 mm.setApp_name(String.valueOf(applicationInfo.loadLabel(pm))); mm.setPackage_name(applicationInfo.packageName); mm.setIcon(applicationInfo.loadIcon(pm)); // 返回转换后的AppModel,map会自动把它发射给下游 return mm; }); }
如果需要返回整个列表:Observable<ArrayList>
如果你确实需要一次性拿到完整的列表,可以用toList操作符把逐个发射的AppModel收集起来,再转成你需要的ArrayList:
public Observable<ArrayList<AppModel>> getMyAppList(PackageManager pm, List<ApplicationInfo> list) { return Observable.fromIterable(list) .subscribeOn(Schedulers.io()) .map(applicationInfo -> { AppModel mm = new AppModel(); mm.set_id(applicationInfo.hashCode()); mm.setApp_name(String.valueOf(applicationInfo.loadLabel(pm))); mm.setPackage_name(applicationInfo.packageName); mm.setIcon(applicationInfo.loadIcon(pm)); return mm; }) // 把所有发射的AppModel收集成List .toList() // 转成ArrayList(如果你的业务必须用ArrayList而不是List) .map(appModelList -> new ArrayList<>(appModelList)) // RxJava 2+中toList返回Single,转成Observable .toObservable(); }
小提示
- 线程选择:
Schedulers.computation()适合计算密集型任务,而加载App信息是和系统PackageManager交互的IO操作,用Schedulers.io()更合理。 - 字符串转换:尽量用
String.valueOf()替代""+,代码更清晰规范。
内容的提问来源于stack exchange,提问作者cattarantadoughan
相关产品推荐
相关产品推荐

