前情提示:
本文只是一个例子,不做过多讲解,入门知识推荐参考
仍物线大神讲解的Rxjava,如何优雅的处理服务器异常,本文没有对Rxjava进行任何封装,也没有使用retrolambda,因为对于初学者来说,看起来费(不)劲(会),而且也没必要。
正文
今天要写的例子是模拟 一个实际的登录请求。
1. 用户登录
2. 根据用户登录的返回结果(Status code),判断是否继续执行 查询用户
开始
1. 首先定义Services接口
public interface IUserServices {
@POST("user/login")
@FormUrlEncoded
Observable login(@Field("acount")String acount, @Field("password") String password);
@GET("user/{userid}")
Observable> getUserById(@Path("userid")String userid);
}
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new LogingInterceptor())
.retryOnConnectionFailure(true)
.addInterceptor(responselog)
.addNetworkInterceptor(new TokenInterceptor())
.build();
配置Retrofit
mRetrofit = new Retrofit.Builder()
.baseUrl(ConstandUtils.SERVICE_BASEURL)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create(gson))
.client(client)
.build();
3. 自定义返回对象
public class JsonResponse {
private int status; //状态码 status_code
private T data;
public int getStatus_code() {
return status;
}
public void setStatus_code(int status_code) {
this.status = status_code;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
@GET("user/{userid}")
Observable getUserById(@Path("userid")String userid);
可是当我发现转换的实体对象的值全为null的时候:
{id='null', acount='null', name='null', email='null', emailConfirmed='null', isLockedOut='null', enterpriseId='null', regAddress='null', mobilPhone='null', phone='null', description='null', creatDate='null', tokenTime='null', accessToken='null', headUrl=null, activiti=0, nickname='null', number=0}
我注意了下 服务器所返回的json字符串:
{"status":0,"data":{"id":null,"acount":"xxxxxxxxx","name":null,"email":null,"emailConfirmed":null,"isLocked....
,而我的User这个对象:
public class User implements Parcelable {
private String id;
private String acount;
private String name;
private String email;
private String emailConfirmed;
private String isLockedOut;
private String enterpriseId;
private String regAddress;
private String mobilPhone;
,后端给我返回的是一个格式的json,所以我定义了JsonResponse
mUserService=mRetrofit.create(IUserServices.class);
mIUserServices
.login(username,pwd) //登录请求,传入用户名和密码,返回Observable 对象
.subscribeOn(Schedulers.io()) //事件产生在io线程
.flatMap(new Func1>>() {
@Override
public Observable> call(ResponseBody responseBody) {
String userid = parse_Login(responseBody); //解析这个Response(相当于在解析 json),得到userid
if("error".equals(userid)) { //status code >0 返回error,表示请求有误
return Observable.error(new Throwable("信息错误"));//随便返回了一个错误信息
}
return mIUserServices.getUserById(userid); //如果有,证明请求成功,那么去查询用户
}
})
.flatMap(new Func1, Observable>() {
@Override
public Observable call(JsonResponse userJsonResponse) {
return Observable.just(userJsonResponse.getData()); //将这个user发送出去
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
mPresenter.onError(e.getMessage());
}
@Override
public void onNext(User user) {
System.out.println("--->user"+user);
}
});
重点内容