有数据要处理的时候如何使用rxJava进行异步处理数据

发布于 2022-09-03 12:53:20 字数 2972 浏览 17 评论 0

我需要实现下面这段代码,但是应该是耗时太长放在主界面会卡,所以希望异步处理

        JsonReader jsonReader = new JsonReader();
        cityObject = jsonReader.jsonObject();
        try {
            cityArray = cityObject.getJSONArray("city_info");
            for (int i=0;i<cityArray.length();i++) {
                Gson gson = new Gson();
                JSONObject city = (JSONObject) cityArray.get(i);
                cityDataList.add(gson.fromJson(city.toString(), CityData.class));
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        provinceList = getProvinceList();
        cityMap = getCityMap();
public class JsonReader {

    public JSONObject jsonObject(){
        InputStream inputStream = getClass().getClassLoader().getResourceAsStream("assets/cityList.json");
        InputStreamReader streamReader = new InputStreamReader(inputStream);
        BufferedReader reader = new BufferedReader(streamReader);
        String line;
        StringBuilder stringBuilder = new StringBuilder();
        try {
            while ((line = reader.readLine()) != null) {
                stringBuilder.append(line);
            }
            reader.close();
            reader.close();
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            JSONObject cityJson = new JSONObject(stringBuilder.toString());
            return cityJson;
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return null;
    }

}
private List<String> getProvinceList() {
        List<String> list = new ArrayList<>();
        for (int i = 0; i < cityDataList.size(); i++) {
            CityData cityData = cityDataList.get(i);
            boolean isProvince = false;
            for (int j = 0; j < list.size(); j++) {
                if (list.get(j).equals(cityData.getProv())) {
                    isProvince = true;
                    break;
                }
            }
            if (isProvince) continue;
            else list.add(cityData.getProv());
        }
        return list;
    }


    private HashMap<String, List<String>> getCityMap() {
        HashMap<String, List<String>> map = new HashMap<>();
        for (int i = 0; i < provinceList.size(); i++) {
            String prov = provinceList.get(i);
            List<String> list = new ArrayList<>();
            for (int j = 0; j < cityDataList.size(); j++) {
                if (cityDataList.get(j).getProv().equals(prov))
                    list.add(cityDataList.get(j).getCity());
            }
            map.put(prov, list);
        }
        return map;
    }

这几个操作循环比较多,比较耗时,我想用rxjava处理,但是对observable的使用还是不太清楚,有人能介绍一下像我这样observable怎么写吗?
我想要改进的是用observable通过flatmap等这些操作符来返回provinceList和cityMap,并且把线程转到后台,在前台接收到这两个数据就好了

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

偏爱你一生 2022-09-10 12:53:20

帮楼主写了下示例代码,像楼主这种需求,其实无须操作符进行变换的。

        Observable.create(new Observable.OnSubscribe<Pair>() {
            @Override
            public void call(Subscriber<? super Pair> subscriber) {
                JsonReader jsonReader = new JsonReader();
                cityObject = jsonReader.jsonObject();
                try {
                    cityArray = cityObject.getJSONArray("city_info");
                    for (int i=0;i<cityArray.length();i++) {
                        Gson gson = new Gson();
                        JSONObject city = (JSONObject) cityArray.get(i);
                        cityDataList.add(gson.fromJson(city.toString(), CityData.class));
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                provinceList = getProvinceList();
                cityMap = getCityMap();
                Pair pair = new Pair(provinceList, cityMap);
            }
        }).subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<Pair>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(Pair pair) {
                //pair.first -> provinceList
                //pair.second -> cityMap
            }
        });
阪姬 2022-09-10 12:53:20

你需要的是cityDataList这个list吧?
那么就可以使用Observable.create来新建一个Observable,把所有操作放在OnSubscribe对象中的call方法中,在最后数据准备完成后调用subscriber相应的onNext就行了。同时处理一下对应的onCompleted和onError

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文