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