2017-07-10 24 views
0

私はRxAndroidで改造してAPIを呼び出しています。ここでは、この方法がRxAndroid onNextが複数回呼び出されています

@GET("product") 
    Observable<BaseResponse<List<Product>>> getProducts(@Query("lang") String lang, 
                 @Query("category_id") String category_id, 
                 @Query("start") String start, 
                 @Query("count") String count); 

定義されている。このAPIはProductのリストを返す方法です。私はリスト内の各Productオブジェクトを処理して、その製品がローカルdb &の製品オブジェクトにブール値を設定しているかどうかをチェックしたかったのです。だから私は、私はこの方法で処理されたリストが必要getProductListに加入している、このよう

public Observable<List<Product>> getProductList(String catId, int start, int count) { 

     final List<Product> products = new ArrayList<>(); 
     return RestClient.callApiWrapper(mContext, true, null, 
       RestClient.get().getProducts("en", catId, "" + start, "" + count)) 
       .subscribeOn(Schedulers.newThread()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .flatMapIterable(new Func1<BaseResponse<List<Product>>, Iterable<Product>>() { 
        @Override 
        public Iterable<Product> call(BaseResponse<List<Product>> listBaseResponse) { 
         Log.e("TAG", "flatMapIterable called"); 
         return listBaseResponse.getData(); 
        } 
       }) 
       .map(new Func1<Product, List<Product>>() { 
        @Override 
        public List<Product> call(Product product) { 
         Log.e("TAG", "map called => " + products.size()); 
         products.add(checkIfProductAddedToCart(product)); 
         return products; 
        } 
       }); 

    } 

それをやった:

mProductListDataModel.getProductList(mCategoryId, mStartOffset, mCount) 
       .subscribeOn(Schedulers.newThread()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(new Subscriber<List<Product>>() { 
        @Override 
        public void onCompleted() { 

        } 

        @Override 
        public void onError(Throwable e) { 

        } 

        @Override 
        public void onNext(List<Product> products) { 
         Log.e("TAG", "onNext => " + products.size()); 
         if(mOnProductListLoaded != null) 
          mOnProductListLoaded.onProductListLoaded(products); 
        } 
       }); 

今、問題がある、APIは、実際に5つの製品のリストを返し、 onNextは毎回5回呼び出され、40個までの製品が増えています。私が間違っていることを教えてください。

答えて

0

私は私のために動作し、以下の通りである、今はいくつかのことを変更しました:

ので、それがどここの次

public Observable<Product> getProductList(String catId, int start, int count) { 

     //final List<Product> products = new ArrayList<>(); 
     return RestClient.callApiWrapper(mContext, true, null, 
       RestClient.get().getProducts("en", catId, "" + start, "" + count)) 
       .subscribeOn(Schedulers.newThread()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .flatMap(new Func1<BaseResponse<List<Product>>, Observable<Product>>() { 
        @Override 
        public Observable<Product> call(BaseResponse<List<Product>> listBaseResponse) { 
         return Observable.from(listBaseResponse.getData()); 
        } 
       }) 
       .map(new Func1<Product, Product>() { 
        @Override 
        public Product call(Product product) { 
         //Log.e("TAG", "map called => " + products.size()); 
         //products.add(checkIfProductAddedToCart(product)); 
         //return products; 
         return checkIfProductAddedToCart(product); 
        } 
       }); 
    } 

のように見えており、変更Productの代わりList<Product> を返すようにgetProductListを変更観察可能なものが購読されました:

final List<Product> products = new ArrayList<>(); 
    mProductListDataModel.getProductList(mCategoryId, mStartOffset, mCount) 
        .subscribeOn(Schedulers.newThread()) 
        .observeOn(AndroidSchedulers.mainThread()) 
        .subscribe(new Subscriber<Product>() { 
         @Override 
         public void onCompleted() { 
          Log.e("TAG", "onCompleted => " + products.size()); 
          if (mOnProductListLoaded != null) 
           mOnProductListLoaded.onProductListLoaded(products); 
         } 

         @Override 
         public void onError(Throwable e) { 

         } 

         @Override 
         public void onNext(Product product) { 
          products.add(product); 
         } 
        }); 

しかし、私はまだ私はよくわかりませんこれが正しい方法です。これが正しい方法でない場合は、教えてください。

関連する問題