亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

android - 有數據要處理的時候如何使用rxJava進行異步處理數據

瀏覽:64日期:2024-03-01 13:32:19

問題描述

我需要實現下面這段代碼,但是應該是耗時太長放在主界面會卡,所以希望異步處理

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,并且把線程轉到后臺,在前臺接收到這兩個數據就好了

問題解答

回答1:

幫樓主寫了下示例代碼,像樓主這種需求,其實無須操作符進行變換的。

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 }});回答2:

你需要的是cityDataList這個list吧?那么就可以使用Observable.create來新建一個Observable,把所有操作放在OnSubscribe對象中的call方法中,在最后數據準備完成后調用subscriber相應的onNext就行了。同時處理一下對應的onCompleted和onError

標簽: java
相關文章:
主站蜘蛛池模板: 18日本xxxxxxⅹxx96 | 国产成人刺激视频在线观看 | 国产成人免费全部网站 | 成人小视频免费 | 高颜值露脸极品在线播放 | 色综合天天娱乐综合网 | 一级毛片一级毛片一级毛片一级毛片 | 亚洲欧美日韩专区一 | 极品白嫩无套视频在线播放张悠雨 | hh99m 福利毛片 | 欧美精品午夜 | 国产精品1区2区3区 国产精品1区2区3区在线播放 | 亚洲香蕉毛片久久网站老妇人 | 五月天婷婷在线视频国产在线 | 久久一本色系列综合色 | 亚洲国产系列一区二区三区 | 精品久久看 | 91丁香亚洲综合社区 | 国产欧美日韩精品高清二区综合区 | 色婷婷丁香六月 | 白丝美女啪啪 | 中日韩一级片 | 亚洲精品久久久成人 | 黄色激情网址 | 五月婷婷久久综合 | 黄色一级毛片免费 | 国产精品免费一区二区区 | 国产乱码精品一区二区三区网页版 | 成人黄色在线网站 | 国产精品99久久久久久www | 免费特级黄毛片 | 婷婷久久激情啪啪 | 国产精品麻豆va在线播放 | 综合图片亚洲 | 日韩免费视频播播 | 草草线禁成18年在线视频 | 国产大片喷水在线在线视频 | 欧美唯爱网 | 播放毛片 | 国产精品午夜国产小视频 | 欧美freexx|