导包
implementation 'com.squareup.retrofit2:retrofit:2.5.0' //Retrofit依赖
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'//可选依赖,解析json字符所用
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
implementation 'com.squareup.retrofit2:adapter-rxjava:2.5.0'
//rxjava依赖
implementation 'io.reactivex:rxjava:1.0.14'
implementation 'io.reactivex:rxandroid:1.0.1'
retrofit部分
javaBean
public class NetBean {
private String result;
public String getResult() {
return result;
}
public void setResult(String result) {
this.result = result;
}
}
interface接口
import retrofit2.http.GET;
import retrofit2.http.Query;
import rx.Observable;
public interface RequestInterface {
@GET("/login")
Observable<String> getToken(@Query("username") String userName,@Query("password") String pwd);
@GET("/user")
Observable<NetBean> getResult(@Query("token") String token);
}
创建请求
这里使用了新的结果解析
Retrofit retrofit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create()) //新的配置
.baseUrl("http://www.baidu.com")
.build();
final RequestInterface requestInterface = retrofit.create(RequestInterface.class);
RxJava部分
嵌套使用,通过嵌套使用获取请求结果,
//rxJava 部分
requestInterface.getToken("1111","22222")
.flatMap(new Func1<String, Observable<NetBean>>() {
@Override
public Observable<NetBean> call(String token) {
return requestInterface.getResult(token); //嵌套使用
}
})
.subscribeOn(Schedulers.newThread()) //上面的请求,在新线程中进行
.observeOn(Schedulers.io()) //下面的操作在IO线程进行
.doOnNext(new Action1<NetBean>() {
@Override
public void call(NetBean netBean) {
//对通过token请求到的结果做处理
}
})
.observeOn(AndroidSchedulers.mainThread()) //下面的线程在主线程中进行
.subscribe(new Observer<NetBean>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(NetBean netBean) {
textView.setText(netBean.getResult());
}
});
完整代码
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
import rx.Observable;
import rx.Observer;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
import rx.functions.Func1;
import rx.schedulers.Schedulers;
public class Net {
public Net() {
}
public void getU(){
//retrofit部分
Retrofit retrofit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create()) //新的配置
.baseUrl("http://www.baidu.com")
.build();
final RequestInterface requestInterface = retrofit.create(RequestInterface.class);
//rxJava 部分
requestInterface.getToken("1111","22222")
.flatMap(new Func1<String, Observable<NetBean>>() {
@Override
public Observable<NetBean> call(String token) {
return requestInterface.getResult(token); //嵌套使用
}
})
.subscribeOn(Schedulers.newThread()) //上面的请求,在新线程中进行
.observeOn(Schedulers.io()) //下面的操作在IO线程进行
.doOnNext(new Action1<NetBean>() {
@Override
public void call(NetBean netBean) {
//对通过token请求到的结果做处理
}
})
.observeOn(AndroidSchedulers.mainThread()) //下面的线程在主线程中进行
.subscribe(new Observer<NetBean>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(NetBean netBean) {
textView.setText(netBean.getResult());
}
});
}
}
异常处理
异常一
No virtual method isSuccess()Z in class Lretrofit2/Response; or its super classes (declaration of ‘retrofit2.Response’ appears in /data/app/…
解决:retrofit与rxjava版本不一致,统一版本:
compile ‘com.squareup.retrofit2:retrofit:2.3.0’
compile ‘com.squareup.retrofit2:adapter-rxjava:2.3.0’
异常二
Failed resolution of: Lokhttp3/internal/Platform;
解决:升级logging-intercepter版本:
compile ‘com.squareup.okhttp3:logging-interceptor:3.4.1’
异常三
连续两次调用 responsebody.string(),第二调用的结果为空
原因:
数据存储在closeable的source中,之后会根据source的编码从source中读取请求响应数据,调用完成后,最终会close source并释放source中的资源,所以第二次调用responseBody.string()时,source已经没有数据,所以无法读取到responseBody中的响应数据