Retrofit + rxAndroid 不講廢話的基本使用方法

本文直接切入主題,只記錄retrofit+rxandroid 的最基本的使用方法.
給初學者的建議是:不提倡直接開始瞭解retrofit+rxandroid的結合使用,應該分開了解每一部分的知識,瞭解兩個部分的用法之後再進行結合.

分享出兩篇優秀的博客地址
想先了解RxJava點這裏
想先了解Retrofit點這裏

正文

以Androidstudio爲例:

  1. 導入依賴
//網絡請求
    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'
  1. 添加權限
   <uses-permission android:name="android.permission.INTERNET" />
  1. 根據請求結果創建實體類 (我以我代碼爲例)
import java.io.Serializable;

//視屏對象的實體類
public class VideoInfoBean implements Serializable {
    private Long id;  //視頻ID
    private String pdVidioName;//視頻名稱,
    ....
}

  1. 創建網絡請求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);
}
  1. 創建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;
    }


}
  1. 在全局的application中初始化retrofit
NetWorkManager.getInstance().init(); //初始化retrofit
  1. 至此 你已經基本上完成了初始化的工作 可以開始進行網絡請求了,以一個簡單的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())

給出的代碼已很完整,如有問題歡迎留言指教.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章