前言
本文我们就通过一个简单的例子,通过 RxJava + Retrofit
的方式实现网络请求。通过该例子,可以学习如何将 Retrofit
和 RxJava
结合进行网络请求。
效果图
具体实现
1. 添加依赖
//Butter Knife
implementation 'com.jakewharton:butterknife:10.2.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.0'
//TitleBar
implementation 'com.github.getActivity:TitleBar:8.6'
//RxJava
implementation 'io.reactivex.rxjava2:rxjava:2.2.10'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
//retrofit
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
//Gson converter
implementation 'com.squareup.retrofit2:converter-gson:2.6.1'
//RxJava2 Adapter
implementation 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
2. 添加网络权限
<uses-permission android:name="android.permission.INTERNET" />
3. 接口介绍
首先来熟悉一下所用到的测试接口,其数据来自于 玩Android 开放API。
返回的数据格式如下:
4. 编写实体类
/**
* Created on 2022/6/24 15:59
*
* @author Gong Youqiang
*/
public class Translation implements Serializable {
@SerializedName("errorCode")
public Integer errorCode;
@SerializedName("errorMsg")
public String errorMsg;
@SerializedName("data")
public List<DataDTO> data;
public static class DataDTO implements Serializable {
@SerializedName("id")
public Integer id;
@SerializedName("link")
public String link;
@SerializedName("name")
public String name;
@SerializedName("order")
public Integer order;
@SerializedName("visible")
public Integer visible;
}
}
5. 定义 Retrofit 需要的请求接口
public interface Api {
@GET("hotkey/json")
Observable<Translation> getCall();
}
当我们需要请求数据时,就应当像下面这样构造一个 Observable<Translation>
:
baseUrl
:定义请求链接的前缀addConverterFactory
:将OKHttp
返回的标准 Response 解析成我们所需要的数据类型 TranslationaddCallAdapterFactory
:将Call<Translation>
转换成Observable<Translation>
,这样才能真正将Retrofit
和RxJava
结合起来。
private Observable<Translation> getObservable() {
Api api = new Retrofit.Builder()
.baseUrl("https://www.wanandroid.com/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build().create(Api.class);
return api.getCall();
}
6. 发起请求
public class MainActivity extends BaseActivity {
private static final String TAG = "MainActivity";
@BindView(R.id.recyclerView)
RecyclerView mRecyclerView;
private NewsAdapter mAdapter;
@Override
protected int getLayoutId() {
return R.layout.activity_main;
}
@Override
protected void initView() {
refreshArticle();
}
private void refreshArticle() {
Observable<Translation> observable = getObservable();
// 步骤2:发送网络请求
observable.subscribeOn(Schedulers.io()) // 在IO线程进行网络请求
.observeOn(AndroidSchedulers.mainThread()) // 回到主线程 处理请求结果
.subscribe(new Observer<Translation>() {
@Override
public void onSubscribe(Disposable d) {
Log.d(TAG, "开始采用subscribe连接");
}
@Override
public void onNext(Translation result) {
mAdapter = new NewsAdapter(R.layout.item_news,result.data);
mRecyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));
mRecyclerView.setAdapter(mAdapter);
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "请求失败");
}
@Override
public void onComplete() {
Log.d(TAG, "请求成功");
}
});
}
private Observable<Translation> getObservable() {
Api api = new Retrofit.Builder()
.baseUrl("https://www.wanandroid.com/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build().create(Api.class);
return api.getCall();
}
}