【问题标题】:Converting an Arraylist<Object> method into RxJava Observable将 Arraylist<Object> 方法转换为 RxJava Observable
【发布时间】:2018-01-15 15:51:42
【问题描述】:

我遇到了 RxJava for android,它是一个很好的库。我是初学者,我了解它是如何工作的,但是我在将旧代码转换为 RxJava 风格的编程时遇到了一些麻烦。

下面是我用来填充对象数组列表的旧代码。

public ArrayList<AppModel> getMyAppList(PackageManager pm, List<ApplicationInfo> list){
        ArrayList<AppModel> temp = new ArrayList<>();


        for(int d=0;d<list.size();d++){
            ApplicationInfo infos = list.get(d);
            AppModel model = new AppModel();
            model.set_id(d);
            model.setApp_name(""+infos.loadLabel(pm));
            model.setPackage_name(""+infos.packageName);
            model.setIcon(infos.loadIcon(pm));
            //Log.e("resolve "," "+infos.loadIcon(pm));
            temp.add(model);
        }

        return temp;
    }

我想要的是将此方法转换为 Observable 并利用 RxJava 功能。

public Observable<AppModel> getMyAppList(PackageManager pm, List<ApplicationInfo> list){



        return Observable
                .from(list)
                .subscribeOn(Schedulers.computation())
                .doOnNext(new Action1<ApplicationInfo>() {
                    @Override
                    public void call(ApplicationInfo applicationInfo) {
                        AppModel mm = new AppModel();
                        mm.set_id(applicationInfo.hashCode());
                        mm.setApp_name(""+applicationInfo.loadLabel(pm));
                        mm.setPackage_name(""+applicationInfo.packageName);
                        mm.setIcon(applicationInfo.loadIcon(pm));


                        //add the models to a list

                    }
                }).//return as Observable<AppModel>
    }

我目前不知道如何将对象返回到 Observable 中,或者应该让我的方法返回 Observable&lt;ArrayList&lt;AppModel&gt;&gt;&gt;

【问题讨论】:

  • 我的方法是否应该返回 Observable>> - 是的,很可能。 Observable 不是 arraylist 的替代品
  • 你可以在最后使用 toList() 将其转换为 List
  • 嗨@TimCastelijns 感谢您的编辑。 Observable 不能像列表一样运行吗?由于 Observable 使用 doOnNext 方法迭代对象。
  • 嗨@dazza5000,使用 toList 将其作为 Observable 返回。
  • 那么您可能需要使用 flatMap 将其转换为您想要的类型或拥有除 ApplicationInfo 列表之​​外的方法

标签: java android arraylist rx-java rx-android


【解决方案1】:

你应该使用 map 而不是 doOnNext

public Observable<AppModel> getMyAppList(final PackageManager pm, List<ApplicationInfo> list){



    return Observable
            .from(list)
            .subscribeOn(Schedulers.computation())
            .map(new Func1<ApplicationInfo, AppModel >() {
                @Override
                public AppModel call(ApplicationInfo applicationInfo) {
                    AppModel mm = new AppModel();
                    mm.set_id(applicationInfo.hashCode());
                    mm.setApp_name(""+applicationInfo.loadLabel(pm));
                    mm.setPackage_name(""+applicationInfo.packageName);
                    mm.setIcon(applicationInfo.loadIcon(pm));

                    return mm;
                }
            });
}

如果您想返回列表而不是发出每个项目,请在地图之后添加:

.toList();

【讨论】:

  • 谢谢你!这就是我需要的。我不知道地图会有 2 个我可以使用的参数。非常感激! @Siavash
猜你喜欢
  • 2014-05-09
  • 1970-01-01
  • 2012-12-27
  • 1970-01-01
  • 1970-01-01
  • 2017-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多