Android自定义RxJava多次调用

问题描述:

我刚刚开始使用RxJava,我有一个问题,我需要从2个不同的firebase json数组中获取数据。这里是我的JSON文件:Android自定义RxJava多次调用

{ "userId" : { 
"category_list" : [ { 
"cat_name" : "Contacts" 
}, { 
"cat_name" : "Home" 
}]}} 

{ "Shopping" : { 
"category_list" : [ { 
"cat_name" : "Clothes" 
}, { 
"cat_name" : "Equipment" 
}]}} 

这里是我的两个JSON

public class CategoryList implements Serializable { 
private List<Category> categoryList; 

public List<Category> getCategoryList() { 
    return categoryList; 
} 

public void setCategoryList(List<Category> categoryList) { 
    this.categoryList = categoryList; 
} 

}

这里是改造的API调用POJO:

@PUT("/userData/{userId}.json") 
     Observable<CategoryList> insertData(@Path("userId") String userId, @Body CategoryList userArray); 

    @GET("/userData/{userId}.json") 
     Observable<CategoryList> getUserCategories(@Path("userId") String userId); 

    @GET("/adminData/Shopping.json") 
     Observable<CategoryList> getAdminCategories(); 

我已经创建一个平面地图rxjava,它首先调用insertData从改造a第二,当调用getUserCategories来自同一个数据库,但我也需要是调用同一个对象(PO​​JO)上getAdminCategories并使用相同的适配器此。这意味着我需要下面的代码来调用和合并(?)两个数据源1 recyclerView有谁知道,我怎么能在下面的代码上做到这一点?这里是代码:

@Override 
public void postArrayAndGetCategories(final String userId, CategoryList userArray) { 
subscription= dataManager.insertData(userId, userArray) 
     .flatMap(new Func1<CategoryList, Observable<CategoryList>>() { 
      @Override 
      public Observable<CategoryList> call(CategoryList categoryList) { 
       // code to save data from service A to db 

       // call service B 
       return dataManager.getUserCategories(userId); 
      } 
     }) 
     .subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribe(new Observer<CategoryList>() { 
      @Override 
      public void onCompleted() { 
      } 

      @Override 
      public void onError(Throwable e) { 
       Log.e(TAG, e.toString()); 
       mainView.showError(e.toString()); 
      } 

      @Override 
      public void onNext(CategoryList categoryList) { 
       mainView.showCategoryList(categoryList); // here I use adapter 
      } 
     }); 
} 
+1

我建议你尝试RxFirebase库,以与RxJava和火力地堡起来较轻松的工作岗位:https://github.com/FrangSierra/Rx2Firebase –

这很容易,如果你想合并两个来源,只需使用merge运算符。

dataManager.getAdminCategories().mergeWith(dataManager.insertData(userId, userArray) 
      .flatMap(new Func1<CategoryList, Observable<CategoryList>>() { 
       @Override 
       public Observable<CategoryList> call(CategoryList categoryList) { 
        // code to save data from service A to db 

        // call service B 
        return dataManager.getUserCategories(userId); 
       } 
      })) 
+0

亚历山大Perfilyev,谢谢你的回答,但似乎错误。当我启动我的活动getAdminCategories结果显示的是第二,但getUserCategories叫我以后只是自败?这是因为mergeWith的什么是错的我的适配器? –

+0

是的,这可能是因为您在添加新项目时清除旧的适配器数据。尝试使用DiffUtil或SortedList作为适配器。减轻它的另一种方法是添加.toList()。这样你只会得到一个onNext()调用。 –

+0

太棒了,你太棒了!谢谢 –