本文直接切入主题,只记录retrofit+rxandroid 的最基本的使用方法.
给初学者的建议是:不提倡直接开始了解retrofit+rxandroid的结合使用,应该分开了解每一部分的知识,了解两个部分的用法之后再进行结合.
分享出两篇优秀的博客地址
想先了解RxJava点这里
想先了解Retrofit点这里
正文
以Androidstudio为例:
- 导入依赖
//网络请求
implementation 'com.squareup.retrofit2:retrofit:2.5.0' // 必要rxjava2依赖
implementation 'com.squareup.retrofit2:converter-scalars:2.5.0' // 必要rxandrroid依赖,切线程时需要用到
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.5.0' // 必要retrofit依赖
implementation 'io.reactivex.rxjava2:rxjava:2.2.7'// 必要依赖,和Rxjava结合必须用到,下面会提到
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'// 必要依赖,解析json字符所用
implementation 'com.squareup.okhttp3:logging-interceptor:3.8.1' //非必要依赖, log依赖,如果需要打印OkHttpLog需要添加
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
- 添加权限
<uses-permission android:name="android.permission.INTERNET" />
- 根据请求结果创建实体类 (我以我代码为例)
import java.io.Serializable;
//視屏對象的實體類
public class VideoInfoBean implements Serializable {
private Long id; //视频ID
private String pdVidioName;//视频名称,
....
}
- 创建网络请求API接口
/**
* API请求接口
*/
public interface Request {
// @GET注解的作用:采用Get方法发送网络请求
// getVideos(...) = 接收网络请求数据的方法
// @Headers(BaseConstant.URL_HEAD)
//首页视频请求
@GET(BaseConstant.HOME_DEFAULT_COMMEND_URL) //这里是自己定义的常量类
Observable<List<VideoInfoBean>> getVideos(@Query("userId") String id);
}
- 创建API管理类
/**
* API初始化类
*/
public class NetWorkManager {
private static NetWorkManager mInstance;
private static Retrofit retrofit;
private static volatile Request request = null;
public static NetWorkManager getInstance() {
if (mInstance == null) {
synchronized (NetWorkManager.class) {
if (mInstance == null) {
mInstance = new NetWorkManager();
}
}
}
return mInstance;
}
/**
* 初始化必要对象和参数
*/
public void init() {
// 初始化okhttp
OkHttpClient client = new OkHttpClient.Builder().build();
// 初始化Retrofit
retrofit = new Retrofit.Builder()
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.baseUrl(BaseConstant.URL_HEAD) //这里的接口请求头根据自己的接口改变
.build();
}
public static Request getRequest() {
if (request == null) {
synchronized (Request.class) {
request = retrofit.create(Request.class);
}
}
return request;
}
}
- 在全局的application中初始化retrofit
NetWorkManager.getInstance().init(); //初始化retrofit
- 至此 你已经基本上完成了初始化的工作 可以开始进行网络请求了,以一个简单的activity为例
public class MainActivity extends BaseActivity implements View.OnClickListener {
private Button btn;
@Override
protected int setContentId() {
return R.layout.activity_main;
}
@Override
protected void initView() { }
@Override
protected void loadData() { }
@Override
protected void bindIdAndListener() {
btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn:
L.d("点击了");
doRequestByRxRetrofit();
break;
}
}
private void doRequestByRxRetrofit() {
Observable<List<VideoInfoBean>> observable = NetWorkManager.getRequest().getVideos("916583"); //这里传入的是接口参数
observable
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<List<VideoInfoBean>>() {
@Override
public void onSubscribe(Disposable d) {
L.d("订阅");
}
@Override
public void onNext(List<VideoInfoBean> videoInfoBeans) {
L.d(videoInfoBeans.size()+"");
}
@Override
public void onError(Throwable e) {
L.d(e.toString());
}
@Override
public void onComplete() {
L.d("完成");
}
});
}
}
这样 一次完整的请求就完成了.
可能遇到的异常:
Unable to create call adapter for io.reactivex.Observable
Unable to create converter for class
请检查 retrofit初始化时是否配置
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
给出的代码已很完整,如有问题欢迎留言指教.