retrofit通过网络线程获得的数据,数据只能在网络线程中使用,无法传递到主线程中。所以可以用rxjava的观察者模式使数据提取在主线程中使用。
build.gradle(:app)
文件的dependencies{}中
//retrofit
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.retrofit2:converter-gson:2.0.2'
//rxjava
//RxJava的依赖包
implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'
//RxAndroid的依赖包
implementation 'io.reactivex.rxjava3:rxjava:3.0.0'
//rxjava+retrofit
implementation "com.squareup.retrofit2:adapter-rxjava3:2.9.0"
用Observable
承接网络类
api类:
//GET请求
//公众号
@GET("wxarticle/chapters/json")
Observable<Data<List<chapters>>> getChapData();
//POST请求,如果有参数需要添加 @FormUrlEncoded注解,即和@Field配合使用
@FormUrlEncoded
@POST("food/getFoods")
Observable<Data<List<Food>>> postFood(@Field("categoryId") Integer categoryId);
Observable
和Call
起相同作用,起获得反调函数的作用
Data以及数据类是根据api网址返回的数据进行定义
函数中各参数可以参考retrofit的说明:Retrofit2 实战(一、使用详解篇) - 掘金 (juejin.cn)
填入前部分的网址
(从此开始在)主函数类:
private Retrofit mRetrofit;
mRetrofit= new Retrofit.Builder()
.baseUrl("https://wanandroid.com/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava3CallAdapterFactory.create()) //多添加的部分
.build();
获得api数据并处理
Api api = mRetrofit.create(Api.class);
//GET请求
api.getTopArticleData() //函数
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Data<List<ArticleDatas>>>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull Data<List<ArticleDatas>> articleListData) {
//将获得的数据赋值到全局变量中,来提取数据
/*填入list为例*/
if (categories == null) return;
Log.i("TAG", "body获得");
List<OrderCategories> info = categories.getData();
if (info == null) return;
Log.i("TAG", "info获得");
for (OrderCategories oi : info) {
titles.add(oi.getName());
Ocategories.add(oi);
}
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
//获得数据后的操作,即有执行顺序的操作
}
});
//POST请求
Observable<Data<List<OrderCategories>>> obcategories = api.postCategories(categoryType); //定义Observable来调用函数
obcategories.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Data<List<OrderCategories>>>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull Data<List<OrderCategories>> categories) {
}
@Override
public void onError(@NonNull Throwable e) {
//报错调试
Log.d(TAG, "onError: 失败");
e.printStackTrace();
}
@Override
public void onComplete() {
}
});