>

retrofit을 사용하여 json 배열을 반환하는 네트워크 API를 누르십시오. 다음 코드를 사용하여 그렇게하고 있습니다.

Observable<MyJson[]> response = (Observable<MyJson[]>)mNetworkService.getReadyObserverable(mNetworkService.getNetworkServiceApi().getMyDataJsons(), MyJson.class, true, useCache);
        mAirlineSubscription = response.subscribe(new Observer<MyJson[]>() {
            @Override
            public void onCompleted() {
                Log.d(TAG, "getData completed..");
            }
            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError: "  + e.getLocalizedMessage());
            }
            @Override
            public void onNext(MyJson[] myJsonData) {
                //I want here json data one by one
            }

그러나 내 문제는 json 데이터 배열이 완전히 다운로드 된 다음에 만 다운로드된다는 것입니다. onNext  호출됩니다. 여기 내가 onNext 를 원한다  개조가 myData[] 에서 첫 번째 json 객체를 다운로드 할 때 호출되어야 함  jyz 배열 및 myData[] 의 모든 json 객체까지 계속 유지  다운로드하십시오. 이렇게하면 UI가 사용자 상호 작용 측면에서보다 반응적이고 좋아 보입니다.

누구든지이 문제를 해결하도록 도와 줄 수 있습니까?

  • 답변 # 1

    서비스는 다음과 같아야합니다 :

    @GET("users/{username}/repos")
    Observable<List<Repository>> publicRepositories(@Path("username") String username);
    
    

    Observable<List<Something>> 반환

  • 답변 # 2

    요소를 최대한 빨리 받는가?
    모든 것이 다운로드 될 때까지 기다리지 않겠습니까?

    해결책은 주석 @Streaming 를 사용하여 개조의 인터페이스 방법을 선언합니다.   Observable<ResponseBody> 를 사용하십시오.  반환 값으로. 그런 다음 flatMap() 를 사용하여 ResponseBody 로 변환  POJO 시리즈 ( Observable<TYPE> ) ).

    예 :

    <올>

    개장 인터페이스 선언 :

    public interface HugeJsonApi {
    String SERVICE_ENDPOINT = "https://raw.githubusercontent.com";
    @Streaming
    @GET("/zemirco/sf-city-lots-json/master/citylots.json")
    Observable<ResponseBody> get();
    }
    
    

    그런 식으로 사용하십시오 :

    public void playHugeJsonSample() {
        HugeJsonApi hugeJsonApi = RestUtils.createService(HugeJsonApi.class, HugeJsonApi.SERVICE_ENDPOINT);
        Handler handler = new Handler(Looper.getMainLooper());
        hugeJsonApi.get()
                .flatMap(responseBody -> convertObjectsStream(responseBody, gson, Feature.class))
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<Feature>() {
                    @Override
                    public void onStart() {
                        super.onStart();
                        request(1);
                    }
                    @Override
                    public void onNext(Feature feature) {
                        Log.i(TAG, gson.toJson(feature));
                        counter[0]++;
                        request(1);
                    }
                    @Override
                    public void onCompleted() {
                        Log.i(TAG, "onCompleted() called. Fetched elements:" + counter[0]);
                    }
                    @Override
                    public void onError(Throwable e) {
                        Log.e(TAG, "something went wrong", e);
                    }
                });
    }
    @NonNull
    private static <TYPE> Observable<TYPE> convertObjectsStream(ResponseBody responseBody, Gson gson, Class<TYPE> clazz) {
        Type type = TypeToken.get(clazz).getType();
        return Observable.create(SyncOnSubscribe.<JsonReader, TYPE>createStateful(
                // initialize the reader
                () -> {
                    try {
                        JsonReader reader = gson.newJsonReader(responseBody.charStream());
                        reader.beginObject();
                        return reader;
                    } catch (IOException e) {
                        e.printStackTrace();
                        RxJavaHooks.onError(e);
                    }
                    return null;
                },
                // read elements one by one
                (reader, observer) -> {
                    if (reader == null) {
                        observer.onCompleted();
                        return null;
                    }
                    try {
                        if (reader.hasNext()) {
                            TYPE t = gson.fromJson(reader, type);
                            observer.onNext(t);
                        }
                        else {
                            observer.onCompleted();
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                        observer.onError(e);
                    }
                    return reader;
                },
                // close the reader
                reader -> {
                    if (reader != null) {
                        try {
                            reader.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                            RxJavaHooks.onError(e);
                        }
                    }
                }
        ));
    }
    
    

    실행 가능한 예는 다음과 같습니다.

    https://github.com/allco/RetrofitAndRxJava

    180 + Mb Json을 가져 와서 실제 스트림으로 파싱합니다.

  • 답변 # 3

    동일한 질문이 있습니다. 개조 요청은

    @GET("StudentApi/getAll")
        Observable<List<Person>> getPersons();
    
    

    그리고 서버 요청을 실행하는 인터페이스가 있으며 getPersons () 및 개인 정보의 json 배열 반환 목록에 대한이 메소드가 있습니다

    Observable<Person> getAllPersons();
    
    

    중요한 부분은 업 메서드의 본문이며 다음과 같습니다

    @Override
        public Observable<Person> getAllPersons() {
            Observable<List<Person>> observable =
                    serviceGenerator.getService().getPersons();
            return observable
                    .flatMap(new Function<List<Person>, Observable<Person>>() {
                        @Override
                        public Observable<Person> apply(List<Person> persons) throws Exception {
                            return Observable.fromIterable(persons);
                        }
                    });
    }
    
    
    fromIterable 메소드가 json 배열의 객체를 하나씩 반환한다는 것을 알았습니다. 그리고 마지막으로 활동에서 나는 벨로우즈와 같은 위로 메소드에서 json 객체를 얻습니다.

    public void getPersons(){
          personsRepository.getAllPersons()
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribeOn(Schedulers.io())
                    .subscribeWith(new DisposableObserver<Person>() {
                        @Override
                        public void onNext(Person value) {
                            Log.e("person info  is",value.getpName() + value.getpFamily());
                        }
                        @Override
                        public void onError(Throwable throwable) {
                            Log.e("onError",throwable.toString());
                        }
                        @Override
                        public void onComplete() {
                            Log.e("onComplete","onComplete");
                        }
                    });
        }
    
    

    나는 희망이있다 :)

관련 자료

  • 이전 python - 열이 특정 값과 일치하는 데이터 프레임에서 정수 행 인덱스 가져 오기
  • 다음 CMake를 사용하여 파일의 문자열을 현재 디렉토리의 값으로 바꾸는 방법