通過對RxAndroid、Retrofit和OkHttp的學習,用它們整合搭建一個基于MVVM的專案,
通過本篇Blog可以學習到如何利用這些框架整合搭建一個專案,
本篇Blog所用原始碼Github地址:MVVM Demo
下面開始進入正題,本篇以獲取公眾號串列資料展示為例,文章目錄按照Demo專案從資料到業務邏輯處理最后到界面展示,
準備作業
-
添加依賴
依賴的版本一定要匹配,不然會出現一些亂七八糟的問題,細節可以看我之前的Blog集成錯誤因為在Retrofit2中使用了JDK8的新特性,所以除了依賴,還要添加支持,
// Support new features of JDK1.8
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
// okHttp 3.14
implementation 'com.squareup.okhttp3:okhttp:3.14.9'
// Retrofit 2.9
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
// Convert Google Json(Convert the result to Model)
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
// Retrofit CallAdapter convert to RxJava
implementation 'com.squareup.retrofit2:adapter-rxjava3:2.9.0'
// RxAndroid 3.0
implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'
- 宣告權限
<uses-permission android:name="android.permission.INTERNET" />
-
專案目錄

建好目錄后,就可以開工了,
請求資料
該實體以玩Android為資料源,
我們使用OkHttp實作網路請求,Retrofit以介面的形式回呼,通過RxAndroid更好的處理業務和展示作業,
- 創建介面
首先,創建公眾號串列資料的介面MpService.java,然后宣告這個geListData()
@GET("wxarticle/chapters/json")
Observable<BaseData<List<MpBean>>> getListData();
- 代理物件
有了介面并不能直接使用,我們需要獲取代理物件,在MainModel.java中通過Retrofit的create方法傳入介面就可以了,
retrofit.create(MpSerivce.class)
- 建立訂閱
我們的介面回傳的是一個Observable,那么我們就需要傳入一個Observer,然后建立訂閱關系,
其中,getListData是用來獲取Observable,subscribe建立訂閱關系,并指定作業執行緒,
/**
* get the proxy object of MpService
* get the observable of proxy object
* build a subscription relationship
* @param observer observer
*/
public void subscribe(Observer<BaseData<List<MpBean>>> observer) {
retrofit.create(MpSerivce.class).getListData()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
}
處理邏輯
創建ViewModel、Adapter及Adapter布局檔案,
- 創建Observer回應事件
Observer<BaseData<List<MpBean>>> observer = new Observer<BaseData<List<MpBean>>>() {
@Override
public void onSubscribe(@io.reactivex.rxjava3.annotations.NonNull Disposable d) {
}
@Override
public void onNext(@io.reactivex.rxjava3.annotations.NonNull BaseData<List<MpBean>> listBaseData) {
if (listBaseData.getErrorCode() == 0) {
mainAdapter.setList(listBaseData.getData());
}
}
@Override
public void onError(@io.reactivex.rxjava3.annotations.NonNull Throwable e) {
// error
}
@Override
public void onComplete() {
Toast.makeText(mContext, "get data completed.", Toast.LENGTH_SHORT).show();
}
};
// build subscription relationship
mainModel.subscribe(observer);
- 創建Adapter處理
@NonNull
@Override
public MainAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
AdapterMainBinding adapterMainBinding = DataBindingUtil.inflate(inflater, R.layout.adapter_main, parent, false);
return new ViewHolder(adapterMainBinding);
}
@Override
public void onBindViewHolder(@NonNull MainAdapter.ViewHolder holder, int position) {
// 不再需要單獨對控制元件賦值,通過DataBinding資料系結
MpBean bean = list.get(position);
if (bean != null) {
holder.binding.setMp(bean);
}
}
class ViewHolder extends RecyclerView.ViewHolder {
private AdapterMainBinding binding;
// 不需要使用itemView進行findViewById,而是直接使用DataBinding
ViewHolder(@NonNull AdapterMainBinding binding) {
super(binding.getRoot());
this.binding = binding;
}
}
界面展示
在MainActivity中通過View Model呼叫即可,
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
mainViewModel = new ViewModelProvider(this).get(MainViewModel.class);
mainViewModel.getMpData();
mainBinding.rvMain.setAdapter(mainViewModel.mainAdapter);
}
效果展示

結束
到這兒本篇Blog就基本結束了,如果有錯誤或者不明白的地方可以留言或者查看本文所用代碼,
Github地址:MVVM Demo
感覺對你有幫助的話,可以隨手Star,謝謝,
本篇參考Blog如下
Retrofit + RxAndroid常見Bug
給Android開發者的RxJava詳解
你真的會用Retrofit嗎?
Android MVVM搭建專案基本版
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/207182.html
標籤:其他
