RxJava是一個可以看到細部資料接收的步驟訊息,這邊先貼上加了Observable的Retrofit執行結果以及程式碼。
近圖
程式碼
onNext
是如果API還有資料的話會一直將我的資料傳回來並接收。onError
是有錯誤就會執行。onComplete
是如果onNext
的資料都接收完了就會來到這裡。再回到上圖的結果顯示,我這邊是沿用Retrofit的專案附加上Rxjava使用。
在近圖
這個結果圖可以看到我的ID抓取到了100(假API的上限資料)接著就Complete了。
//Observable模式的Retrofit
@GET("posts")
Observable<Response<List<APIResponse>>> observableResponse();
=====================================================================
// MainActivity的副程式撰寫
public void GetObservableResponse(){
apiService.observableResponse()
.subscribeOn(//要在哪一個線程執行)
.observeOn(//要載哪一個線程顯示)
.subscribe(new DisposableObserver<Response<List<APIResponse>>>() {
@Override
public void onNext(@NonNull Response<List<APIResponse>> listResponse) {
//TODO 執行的程式
}
@Override
public void onError(@NonNull Throwable e) {
Log.e(TAG, "onError: "+e );
}
@Override
public void onComplete() {
Log.e(TAG, "已完成資料接收 ");
}
});
}
前言預覽看完後就來到程式碼以及依賴的建立了。
前面的Retrofit已經建立過的可以跳過Retrofit的dependencies,來到下面的這兩行去做建立。
//Retrofit2
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation("com.squareup.okhttp3:okhttp:4.10.0")
// Rxjava
implementation 'io.reactivex.rxjava3:rxjava:3.1.5'
implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'
// Retrofit & RxJava
implementation "com.github.akarnokd:rxjava3-retrofit-adapter:3.0.0"
這邊我建立兩種形式,一種是Single,另一種是最為基本的Observable。
- Single的回覆就是簡單的有抓到或是沒抓到的回覆結果
- Observable的回覆是向上方預覽的那樣,有onNext、onError、onComplete這三種。
// retrofit建立方式
@GET("posts")
Call<List<APIResponse>> response();
------ 分隔線(複製貼上請跳過這行) ------
//結合Rxjava的建立方式
@GET("posts")
Single<Response<List<APIResponse>>> SingleResponse();
@GET("posts")
Observable<Response<List<APIResponse>>> observableResponse();
Observable的副程式撰寫
這個的寫法就是前言預覽的方法。
[subscribeOn]
跟[observeOn]
都需要一個**scheduler**
的參數來指定我們動作所需要的thread
(線程)要從哪裡使用。常用的有以下這幾種 scheduler:
Schedulers.io()
:Schedulers.computation()
:Schedulers.newThread()
:這邊再補充前面前言預覽空格裡的線程
subscribeOn()
:這邊我是寫Schedulers.io()
。observeOn()
:AndroidSchedulers.mainThread()
,是指在主線程執行回覆。public void GetObservableResponse(){
apiService.observableResponse()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new DisposableObserver<Response<List<APIResponse>>>() {
@Override
public void onNext(@NonNull Response<List<APIResponse>> listResponse) {
for(int i = 0;i<listResponse.body().size();i++){
Log.e(TAG, "onNextId: "+listResponse.body().get(i).getId() );
Log.e(TAG, "onNextUserId: "+listResponse.body().get(i).getUserId() );
Log.e(TAG, "onNextTitle: "+listResponse.body().get(i).getTitle() );
Log.e(TAG, "onNextBody: "+listResponse.body().get(i).getBody() );
}
}
@Override
public void onError(@NonNull Throwable e) {
Log.e(TAG, "onError: "+e );
}
@Override
public void onComplete() {
Log.e(TAG, "已完成資料接收 ");
}
});
}
onSuccess()
:成功接到回覆。onError()
:接收失敗。public void GetRxjavaSinglePostsResponse(){
apiService.SingleResponse()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new DisposableSingleObserver<Response<List<APIResponse>>>() {
@Override
public void onSuccess(@NonNull Response<List<APIResponse>> listResponse) {
for(int i = 0;i<listResponse.body().size();i++){
Log.e(TAG, "onSuccess: "+listResponse.body().get(i).getId() );
Log.e(TAG, "onSuccess: "+listResponse.body().get(i).getUserId() );
Log.e(TAG, "onSuccess: "+listResponse.body().get(i).getTitle() );
Log.e(TAG, "onSuccess: "+listResponse.body().get(i).getBody() );
}
Log.e(TAG, "onSuccess: "+listResponse );
}
@Override
public void onError(@NonNull Throwable e) {
Log.e(TAG, "onError: "+e );
}
} );
}
.addCallAdapterFactory(RxJava3CallAdapterFactory.create())
才能正常回覆出資訊結果。Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://jsonplaceholder.typicode.com/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava3CallAdapterFactory.create())
.build();