首先引入依赖
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
在写一个接口RetrofitService
//@get 加注解 被观察者observable 选io包的 泛型 responsebody get 括号里加注解网址和查询集合map
@GET
Observable<ResponseBody> get(@Url String url, @QueryMap Map<String,String> map);
@POST
Observable<ResponseBody> post(@Url String url, @QueryMap Map<String,String> map);
在写工具类RetrofitUtils 省略了必须初始化方法更简便
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
import okhttp3.ResponseBody;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
public class RetrofitUtils {
private final RetrofitService retrofitService;
private RetrofitListener retrofitListener;
//本类的构造方法
public RetrofitUtils() {
//new retrofit 返回值 在builder.添加call 适配器工厂括号里传 Rxjava 2工厂 初始化 .baseurl 传域名.build提交
Retrofit retrofit = new Retrofit.Builder()
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.baseUrl("域名")
.build();
//用retrofit调用初始化 传接口 返回值 提上去
retrofitService = retrofit.create(RetrofitService.class);
}
//公共的get 方法传调用接口的参数
public RetrofitUtils get(String url, Map<String,String> map){
//先判断集合为空
if(map==null){
//map=new hasmap 泛型为空
map=new HashMap<>();
}
//调用提上去的接口 .get 传两个参数.subscribeon 传大写schedulers.io .subscribeon传安卓schedulers.mainthresd
//.subscribe 传下面封装的观察者
retrofitService
.get(url,map)
.subscribeOn(Schedulers.io())
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
//记得返回this
return this;
}
//post 复制get 方法 改两个post
//公共的get 方法传调用接口的参数
public RetrofitUtils post(String url, Map<String,String> map){
//先判断集合为空
if(map==null){
//map=new hasmap 泛型为空
map=new HashMap<>();
}
//调用提上去的接口 .get 传两个参数.subscribeon 传大写schedulers.io .subscribeon传安卓schedulers.mainthresd
//.subscribe 传下面封装的观察者
retrofitService
.post(url,map)
.subscribeOn(Schedulers.io())
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
//记得返回this
return this;
}
//封装观察者 observer 记住io包 new 泛型 responsebody 实现四个方法
private Observer observer=new Observer<ResponseBody>(){
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(ResponseBody responseBody) {
//成功方法
//把传进来的responsebody .小写字符串 先抓异常 后返回值
try {
String s = responseBody.string();
//去下面定义接口
//调用接口的成功方法 传字符串
retrofitListener.success(s);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onError(Throwable e) {
//失败方法
//把传进来的e.获取信息 返回值
String message = e.getMessage();
//调用接口失败方法传字符串
retrofitListener.fail(message);
}
@Override
public void onComplete() {
}
};
//接口回调方法
public void result(RetrofitListener retrofitListener){
//接口返回值 this. 提上去
this.retrofitListener = retrofitListener;
}
//定义接口
public interface RetrofitListener{
//定义成功方法传字符串
void success(String s);
//定义失败方法传字符串
void fail(String message);
}
}
最后在主页面调用工具类
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
private String url1="域名后面的网址";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//直接new 工具类 调用
new RetrofitUtils().get(url1,null).result(new RetrofitUtils.RetrofitListener() {
@Override
public void success(String s) {
//子线程不能更新UI 不能吐司 否则会报错
//打印log
Log.d("MainActivity","请求网络成功"+s);
}
@Override
public void fail(String message) {
//子线程不能更新UI 不能吐司 否则会报错
//打印log
Log.d("MainActivity","请求网络失败");
}
});
}
}