带有 MVVM 和 Retrofit 的 RXjava

RXjava with MVVM and Retrofit

我想将 RxJava 与 MVVM 一起使用,但我不明白为什么它不响应 CompositeDisposable 我的 Response class

我想处理 RxJava,但我不知道如何 link CompositeDisposable 和

实时数据

...

LiveData
     public
        LiveData <HomeResponse> setMenu() {
            final MutableLiveData <HomeResponse> data = new MutableLiveData <>( );

                compositeDisposable.add(apiRequest.getMenu()
                                                .subscribeOn( Schedulers.io())
                                                .observeOn( AndroidSchedulers.mainThread())
                                                .subscribe( new Consumer <Response<HomeResponse>>() {
                                                    @Override
                                                    public void accept(Response<HomeResponse>
                                                     registrationModelResponse) throws Exception  {

                                                       data.setValue(registrationModelResponse.body());
                                                    }
                                                }));



            return data;
        }

....... 响应 class :

  public
class HomeResponse {

    @SerializedName("status")
    @Expose
    private String status;
    @SerializedName("totalResults")
    @Expose
    private Integer totalResults;
    @SerializedName("Menu")
    @Expose
    private List <MainMenu> MainMenu = null;

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public Integer getTotalResults() {
        return totalResults;
    }

    public void setTotalResults(Integer totalResults) {
        this.totalResults = totalResults;
    }

    public List<MainMenu> getMainMenu() {
        return MainMenu;
    }

    public void setAUsers(List<MainMenu> MainMenu) {
        this.MainMenu = MainMenu;
    }
}

....... 我的 API :

  @GET("getmenu.php")
   Observable<List <HomeResponse>> getMenu();

....... 错误听到...

 .subscribe( new Consumer <Response<HomeResponse>>() {
                                                @Override
                                                public void accept(Response<HomeResponse>
                                                 registrationModelResponse) throws Exception  {

                                                   data.setValue(registrationModelResponse.body());
                                                }
                                            }));

enter image description here

我想你可能混淆了如何处理 LiveData

通常,如果您想从 LiveData 获取值,您的 activity 或片段就是需要观察它的人。像这个例子。

// I have 'valueA' as variable in viewModel.
val valueA = MutableLiveData<String>()


// In Main Activity. I observe 'valueA' here
fun initObserver() {
    viewModel.valueA.observe(this, Observer { it -> // it is value of livedata 'data'
        // do something with 'valueA'.
    })
}

并且您的 setMenu() 函数不应 return 来自 API 的值,因为当您这样调用 API 时,它是异步调用。因此,当您 return 您的价值时,您的 API 调用仍未完成。

这应该是你的职能。

public void setMenu() {
        final MutableLiveData <List<HomeResponse>> data = new MutableLiveData <>( );

            compositeDisposable.add(apiRequest.getMenu()
                                            .subscribeOn( Schedulers.io())
                                            .observeOn( AndroidSchedulers.mainThread())
                                            .subscribe( new Consumer <List<HomeResponse>>() {
                                                @Override
                                                public void accept(List<HomeResponse>
                                                 registrationModelResponse) throws Exception  {

                                                   data.setValue(registrationModelResponse);
                                                }
                                            }));



    }

PS。对不起我糟糕的英语水平。

PS2。您来自 API 的回复将 return List<HomeResponse>,但在您的消费者中它变成了 Result<HomeResponse>,因此会导致错误。