本文直接切入主題,只記錄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())
給出的代碼已很完整,如有問題歡迎留言指教.