结合Retrofit+LiveData+ViewModel,访问网路数据并展示
编写请求接口
public interface HomeRequest {
@GET("banner/json")
Call<BaseResponse<List<BannerResponse>>> getBanner();
@GET("article/top/json")
Call<BaseResponse<List<TopResponse>>> getTop();
}
在ViewModel中访问网络请求数据,并且通过LiveData将数据发送给监听者,wanandroid数据结构统一,编写消息基类
public class BaseResponse<T> {
public T data;
public int errorCode;
public String errorMsg;
public BaseResponse(T data, int errorCode, String errorMsg) {
this.data = data;
this.errorCode = errorCode;
this.errorMsg = errorMsg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public int getErrorCode() {
return errorCode;
}
public void setErrorCode(int errorCode) {
this.errorCode = errorCode;
}
public String getErrorMsg() {
return errorMsg;
}
public void setErrorMsg(String errorMsg) {
this.errorMsg = errorMsg;
}
}
完整ViewModel代码
import android.app.Application;
import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
import com.jetpack.demo.common.Constant;
import com.jetpack.demo.model.BaseResponse;
import com.jetpack.demo.model.RetrofitUtil;
import com.jetpack.demo.model.home.BannerResponse;
import com.jetpack.demo.model.home.HomeRequest;
import com.jetpack.demo.model.home.TopResponse;
import org.jetbrains.annotations.NotNull;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class HomeViewModel extends AndroidViewModel {
private MutableLiveData<List<BannerResponse>> bannerLD;
private MutableLiveData<List<TopResponse>> topLD;
private HomeRequest request;
public HomeViewModel(@NonNull @NotNull Application application) {
super(application);
request = RetrofitUtil.getInstance().getRetrofit().create(HomeRequest.class);
}
public MutableLiveData<List<TopResponse>> getTopLD() {
if (topLD == null){
topLD = new MutableLiveData<List<TopResponse>>();
}
return topLD;
}
public void setTopLD(MutableLiveData<List<TopResponse>> topLD) {
this.topLD = topLD;
}
public MutableLiveData<List<BannerResponse>> getBannerLD() {
if (bannerLD == null){
bannerLD = new MutableLiveData<List<BannerResponse>>();
}
return bannerLD;
}
public void setBannerLD(MutableLiveData<List<BannerResponse>> bannerLD) {
this.bannerLD = bannerLD;
}
// TODO: Implement the ViewModel
public void getBanner(){
Call<BaseResponse<List<BannerResponse>>> call = request.getBanner();
call.enqueue(new Callback<BaseResponse<List<BannerResponse>>>() {
@Override
public void onResponse(Call<BaseResponse<List<BannerResponse>>> call, Response<BaseResponse<List<BannerResponse>>> response) {
if (response.body().errorCode == Constant.HTTP_CODE_OK){
bannerLD.postValue(response.body().data);
}
}
@Override
public void onFailure(Call<BaseResponse<List<BannerResponse>>> call, Throwable t) {
}
});
}
public void getTop(){
Call<BaseResponse<List<TopResponse>>> call = request.getTop();
call.enqueue(new Callback<BaseResponse<List<TopResponse>>>() {
@Override
public void onResponse(Call<BaseResponse<List<TopResponse>>> call,
Response<BaseResponse<List<TopResponse>>> response) {
if (response.body().errorCode == Constant.HTTP_CODE_OK){
topLD.postValue(response.body().data);
}
}
@Override
public void onFailure(Call<BaseResponse<List<TopResponse>>> call, Throwable t) {
}
});
}
}
在Activity中获取数据并展示
mViewModel = new ViewModelProvider(this).get(HomeViewModel.class);
mViewModel.getBannerLD().observe(getActivity(), new Observer<List<BannerResponse>>() {
@Override
public void onChanged(List<BannerResponse> bannerResponses) {
Log.i(TAG,"bannerResponses = "+bannerResponses.size());
}
});
mViewModel.getTopLD().observe(getActivity(), new Observer<List<TopResponse>>() {
@Override
public void onChanged(List<TopResponse> topResponses) {
Log.i(TAG,"topResponses = "+topResponses.size());
}
});
mViewModel.getBanner();
mViewModel.getTop();