Android中Retrofit2和RxJava2的结合使用

Retrofit2和RxJava2的结合使用

Retrofit2和RxJava2的结合使用

记录成长之路(不定时更新)!
我也是最近才开始使用Retrofit2的一些不连通的地方还请多多指教哈。
一个简单的例子 获取天气预报的接口数据
首先导入一些依赖

	//retrofit
    implementation 'com.squareup.retrofit2:retrofit:2.5.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.5.0' // 用Gson解析json的转换器
    //Rxjava
    implementation 'io.reactivex.rxjava2:rxjava:2.1.3'
    implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
    implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'

首先需要明白我们的字符串是需要哪些参数的(例子是 请求天气预报)

http://api.help.bj.cn/apis/life27/?id=北京
post请求我们只需要一个id即可 前面的都是基础拼接url(以实际项目为主)

1.1创建一个接口服务,用于retrofit2(POST请求)

public interface ApiService {
    /**
     *    请求接口的地址 以及参数(当前是POST请求)
     * @return  http://api.help.bj.cn/apis/life27/?id=北京
     */
    @POST("apis/life27/")
    Observable<JsonObject> getHanfu(@Query("id") String city);//@Query是追加参数
}

1.2 创建一个基础的retrofit2工具类

/**
 * 基础地址
 */
public class BaseRetrofit2 {
    public static Retrofit BaseRe(){
        Retrofit retrofit=new Retrofit.Builder()
                .baseUrl("http://api.help.bj.cn/")
                .addConverterFactory(GsonConverterFactory.create())//Gson解析器
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())//设置支持RXjava2
                .build();
        return retrofit;
    }
}

我们还需要一个请求(调用)的类 ,结合Retrofit2和Rxjava2的类(用于简洁Activity中的代码只需调用即可)

2.1简单的封装类(直接调用方法) 处理登录/注册/忘记方法操作可以 写在该类中

/**
 * 简单的封装类(直接调用方法) 处理登录/注册/忘记方法什么的可以 写在该类中
 */
public class GetMessage {
	(java多态)
    Retrofit retrofit= BaseRetrofit2.BaseRe();//调用封装基础url
    ApiService apiService=retrofit.create(ApiService.class);//连接请求参数和retrofit2  通过Retrofit实例创建接口服务对象

    public void GetHanfu(final ReturnMessage message) {
        apiService.getHanfu("北京")
                .observeOn(AndroidSchedulers.mainThread())//支持Android观察者
                .subscribeOn(Schedulers.io())//支持io流订阅者
                .subscribe(new Consumer<JsonObject>() {
                    @Override
                    public void accept(JsonObject jsonObject) throws Exception {
                        //赋值
                        ReturnMessageJson.ReturnJson(message,jsonObject);
                    }
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {

                    }
                });
    }
}

最后需要一个返回结果的类 (我们可以想象,如果都在上面的类中处理的话会不会很凌乱,而我们只需要JsonObject结果即可)

3.1 写一个接口供全局使用

/**
 * 定义接口 供全局使用
 */
public interface ReturnMessage {
    void returnJson(JsonObject jsonObject);
}

3.2 提供静态方法,实现接口方法

public class ReturnMessageJson {
    /**
     * 返回信息方法类 给接口赋值
     * @param jsonObject json
     * @param message 接口
     * 接口作为参数就是,要传递一个实现了这个接口的对象
     */
    public static void ReturnJson(ReturnMessage message, JsonObject jsonObject){
        message.returnJson(jsonObject);
    }
}

最后在Activity中就调用即可

public class MainActivity extends AppCompatActivity {

    private GetMessage getMessage = new GetMessage();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button=findViewById(R.id.btn);
        final TextView tv_content=findViewById(R.id.text1);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //回调接口
                getMessage.GetHanfu(new ReturnMessage() {
                    @Override
                    public void returnJson(JsonObject jsonObject) {
                        tv_content.setText(jsonObject.toString());
                    }
                });
            }
        });
    }
}

效果如下所示(可以看见已经请求成功了)

Android中Retrofit2和RxJava2的结合使用_第1张图片

你可能感兴趣的:(安卓基础)