android - 有數(shù)據(jù)要處理的時(shí)候如何使用rxJava進(jìn)行異步處理數(shù)據(jù)
問題描述
我需要實(shí)現(xiàn)下面這段代碼,但是應(yīng)該是耗時(shí)太長(zhǎng)放在主界面會(huì)卡,所以希望異步處理
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; }
這幾個(gè)操作循環(huán)比較多,比較耗時(shí),我想用rxjava處理,但是對(duì)observable的使用還是不太清楚,有人能介紹一下像我這樣observable怎么寫嗎?我想要改進(jìn)的是用observable通過flatmap等這些操作符來返回provinceList和cityMap,并且把線程轉(zhuǎn)到后臺(tái),在前臺(tái)接收到這兩個(gè)數(shù)據(jù)就好了
問題解答
回答1:幫樓主寫了下示例代碼,像樓主這種需求,其實(shí)無須操作符進(jìn)行變換的。
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這個(gè)list吧?那么就可以使用Observable.create來新建一個(gè)Observable,把所有操作放在OnSubscribe對(duì)象中的call方法中,在最后數(shù)據(jù)準(zhǔn)備完成后調(diào)用subscriber相應(yīng)的onNext就行了。同時(shí)處理一下對(duì)應(yīng)的onCompleted和onError
相關(guān)文章:
1. Docker for Mac 創(chuàng)建的dnsmasq容器連不上/不工作的問題2. java - 一段遞歸代碼的問題3. java - instance method中 static后的<K>是什么意思?4. 錯(cuò)誤:java.lang.NoSuchMethodError:org.objectweb.asm.ClassWriter。<init>(I)V5. java - com.android.internal.R.attr.dialogTheme 這個(gè)dialogTheme的內(nèi)容再哪里查看?6. python3.x - python連oanda的模擬交易api獲取json問題第五問7. javascript - QWebEngineView 如何爬 angular 的動(dòng)態(tài)數(shù)據(jù)?8. node.js - npm 非管理員權(quán)限 全局安裝問題9. html5 - 這個(gè)代碼顯示功能如何實(shí)現(xiàn)?10. node.js - 終端 遠(yuǎn)程連接服務(wù)器,終端關(guān)閉后,服務(wù)器無法運(yùn)行
