android - 有数据要处理的时候如何使用rxJava进行异步处理数据
ringa_lee
ringa_lee 2017-04-17 17:38:54
0
2
774

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

        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,并且把线程转到后台,在前台接收到这两个数据就好了

ringa_lee
ringa_lee

ringa_lee

모든 응답(2)
迷茫

원본 포스터에 대한 샘플 코드를 작성했습니다. 원본 포스터와 같은 요구 사항에 대해서는 실제로 운영자가 변환을 수행할 필요가 없습니다.

으아악
伊谢尔伦

cityDataList 목록이 필요한 거겠죠?
그런 다음 Observable.create를 사용하여 새 Observable을 생성하고 모든 작업을 OnSubscribe 개체의 호출 메서드에 넣고 최종 데이터 준비가 완료된 후 구독자의 해당 onNext를 호출할 수 있습니다. 동시에 해당 onCompleted 및 onError

를 처리합니다.
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿