首页 > 解决方案 > 我在这段代码中正确使用 LiveData 吗?(作品)

问题描述

我是 Android 开发的新手,我正在尝试使用一种好的模式来使用 ViewModel、Retrofit、LiveData 从 Web 服务访问我的数据。寻找有关此模式的反馈。

我经历了一些迭代和在线指南,并想出了这个

从活动:

LiveData<TicklerResponse> ticklerLiveData = 
ticklerViewModel.search(ticklerSearchObject);
    ticklerLiveData.observe(this, new Observer<TicklerResponse>() {
        @Override
        public void onChanged(@Nullable TicklerResponse ticklerResponse) {
            Log.d(TAG, "onChanged: ticklerResponse size = " + ticklerResponse.getContent().size());
        }
    });

视图模型

public LiveData<TicklerResponse> search(TicklerSearchObject ticklerSearchObject) {
    TicklerRepository ticklerRepository = TicklerRepository.getInstance();
    String header = OscarOAuthContainer.getInstance()
            .generateAuthorizationHeader(Verb.POST,"/tickler/search?startIndex=0&limit=1000");
    MutableLiveData<TicklerResponse> liveData = new MutableLiveData<TicklerResponse>();
    ticklerRepository.search(header,liveData, ticklerSearchObject);
    return liveData;
}

存储库

public void search(final String authHeader, final MutableLiveData<TicklerResponse> ticklerLiveData, TicklerSearchObject ticklerSearchObj) {
    Log.d(TAG, "search: called");
    Call<TicklerResponse> call = api.search(authHeader,0,1000,ticklerSearchObj);
    call.enqueue(new Callback<TicklerResponse>() {

        @Override
        public void onResponse(Call<TicklerResponse> call, Response<TicklerResponse> response) {
            if(response.isSuccessful()){
                Log.d(TAG, "onResponse: successful response for getProvider");
                TicklerResponse result = response.body();
                ticklerLiveData.setValue(result);
            } else {
                Log.d(TAG, "onResponse: NOT SUCCESSFUL");
            }
        }

        @Override
        public void onFailure(Call<TicklerResponse> call, Throwable t) {
            t.printStackTrace();
        }
    });

}

它似乎有效,但我担心我是否正确使用 LiveData 结构来实例化/传递它。

标签: androidandroid-livedataandroid-viewmodelandroid-mvvm

解决方案


推荐阅读