【问题标题】:Rxjava2, Retrofit2 - transfer data between two classes.Rxjava2, Retrofit2 - 在两个类之间传输数据。
【发布时间】:2017-12-12 12:30:53
【问题描述】:

我有简单的 Observable。

public interface CitiesApi {
    @GET("location/cities")
    Observable<List<City>> getCities(@Query("country") String countryId);
}

我还有两个班级:

class Manager {

List<City> mList = new ArrayList();

public Observable<List<City>> getCitiesObservable(String countryId) {
// I want to update mList value in each new request;
 return CitiesApi.getCities(countryId);
}

二等:

class Presenter {

    public void request() {


    Manager.getCitiesObservable("us")
           .subscribeOn(Schedulers.newThread)
           .observeOn(AndroidSchedulers.mainThread)
           .subscribe(new ......)
        }

如您所见,我写了一条评论“我想在每个新请求中更新 mList 值”。 每次 Presenter 发出请求时,我如何更新 Manager 类中的 mList ?

【问题讨论】:

  • Serialize你从那个请求得到的响应了吗?
  • 什么意思?
  • 我会用我做的方式发布答案,也许你会更好理解
  • 好的。我在等待。谢谢。

标签: android retrofit2 rx-java2


【解决方案1】:

您应该使用 RxJava 的转换运算符(如map)来实现您想要做的事情。这是所有运算符的列表 - ReactiveX - Operators

你可以这样做:

class Manager {

    List<City> mList = new ArrayList();

    public Observable<List<City>> getCitiesObservable(String countryId) {
        return CitiesApi.getCities(countryId)
                .subscribeOn(Schedulers.io())
                .map(new Function<List<City>, List<City>>() {
                    @Override
                    public List<City> apply(List<City> cities) throws Exception {
                        // Do your stuff and return a List<City> object
                    }
                });
    }
}

【讨论】:

    【解决方案2】:

    好的,这是我的承诺:

    假设您设置了适配器并准备了您的mList,我就是这样做的。 调用请求并将响应正文放入变量的函数

    private void makeGetMyChatsRequest(String searchWord){
        RestClient.getApi().getChats(searchWord).enqueue(new Callback<Chats>() {
            @Override
            public void onResponse(Call<Chats> call, Response<Chats> response) {
                if (response.isSuccessful())
                    if (response.code() == 200){
                        chatsDatas = response.body().getChats();
                        chatAdapter.notifiDataSetChanged();
                    }
            }
    
            @Override
            public void onFailure(Call<Chats> call, Throwable t) {
                Log.d(TAG, "-=onFailure=-\n" + t.getMessage());
            }
        });
    }
    

    这是改造界面

    @GET(RestClient.API_GET_CHATS)
    Call<Chats> getChats(@Query("username") String username);
    

    它响应的对象的type,在我的例子中是&lt;Chats&gt;

    public class Chats implements Serializable {
    private ArrayList<ChatsData> chats;
    
    public ArrayList<ChatsData> getChats() {
        return chats;
    }
    
    public void setChats(ArrayList<ChatsData> chats) {
        this.chats = chats;
    }
    }
    

    因为我有一个数据数组,所以我还在这个数组中定义了数据的类型(将传递给请求调用函数上的chatsDatas 变量的确切数据。

    public class ChatsData implements Serializable {
    private int chat_room_id;
    private int read;
    private int user_id;
    private String name;
    private String picture;
    private int is_online;
    private LastMessageData last_message;
    //here will be getters & setters for each field
    }
    

    【讨论】:

    • 谢谢,但我想用 rxjava 来做。我希望我的班级经理获取数据,Presenter 将收到哪个班级
    • 好的,但是更新列表的思路应该是一样的,你获取新数据再设置到列表中
    • 我明白了。但是你用一个班级来做,如果我有 20 多个经理怎么办?您的代码看起来不通用且没有 rx。我希望我的班级经理会像这样 return CitiesApi.getCities(countryId).doOnNext (SAVE DATA IN CLASS MANAGER) ;
    • Pfff.. 你想在班级管理器中保存数据.. 这听起来不适合我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-23
    • 1970-01-01
    • 1970-01-01
    • 2018-03-25
    • 2018-02-11
    • 1970-01-01
    相关资源
    最近更新 更多