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())

给出的代码已很完整,如有问题欢迎留言指教.

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