第一部分
RxJavaLoginService 接口
package com.tz.architect.retrofit.simple7.inter;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;
import rx.Observable;
import com.tz.architect.retrofit.simple5.model.UserBean;
public interface RxJavaLoginService {
/**
*这里不能再用call了,要用Observable
*/
@FormUrlEncoded
@POST("LoginServlet")
Observable<UserBean> login(@Field("username") String uname,
@Field("password") String password);
}
SimpleRetrofitRxJava 类
package com.tz.architect.retrofit.simple7;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
import rx.Observer;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
import com.tz.architect.retrofit.simple1.SimpleSystemLogin.OnHttpResultListener;
import com.tz.architect.retrofit.simple5.model.UserBean;
import com.tz.architect.retrofit.simple7.inter.RxJavaLoginService;
public class SimpleRetrofitRxJava {
/**
* 第一步:配置支持Rxjava环境
*/
private static String URL_GETUSER = "http://192.168.2.1:8080/Dream_Architect_Retrofit_Server/";
public static void login(String username, String password,
final OnHttpResultListener onHttpResultListener) {
Retrofit retrofit = new Retrofit.Builder().baseUrl(URL_GETUSER)
//注意这里的添加
//添加RxJava转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
//添加Gson转换器 .addConverterFactory(GsonConverterFactory.create()).build();
RxJavaLoginService loginService = retrofit
.create(RxJavaLoginService.class);
//返回值是:Observable<UserBean>
//subscribeOn:指定发送的网络请求所在的线程
//io线程:Schedulers.io()
//回调所在的线程:AndroidSchedulers.mainThread()
loginService.login(username, password).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<UserBean>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(UserBean t) {
onHttpResultListener.onHttpResult(t.toString());
}
});
}
}
main类
package com.tz.architect.retrofit;
import android.app.Activity;
import android.os.Bundle;
import com.tz.architect.retrofit.simple1.SimpleSystemLogin;
import com.tz.architect.retrofit.simple1.SimpleSystemLogin.OnHttpResultListener;
import com.tz.architect.retrofit.simple2.SimpleOkHttpLogin;
import com.tz.architect.retrofit.simple3.SimpleRetrofitLogin;
import com.tz.architect.retrofit.simple4.SimpleRetrofitUploadImage;
import com.tz.architect.retrofit.simple5.SimpleRetrofitGson;
import com.tz.architect.retrofit.simple6.SimpleRetrofitXml;
import com.tz.architect.retrofit.simple7.SimpleRetrofitRxJava;
import com.tz.architect.retrofit.simple8.MyRetrofitTest;
import com.tz.architect.retrofit.utils.FileManager;
import com.tz.architect.retrofit.utils.ToastUtil;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// simpleSystemLogin();
// simpleOkHttpLogin();
// simpleRetrofitLoginSync();
// simpleRetrofitLoginAsync();
// simpleRetrofitLoginGetAsync();
// simpleRetrofitLoginGetQueryMap();
// simpleRetrofitUploadImage();
// simpleRetrofitLoginGson();
// simpleRetrofitConvertXml();
// simpleRetrofitRxJava();
simpleMyRetrofitTest();
}
private OnHttpResultListener onHttpResultListener = new OnHttpResultListener() {
@Override
public void onHttpResult(Object result) {
if (result == null) {
ToastUtil.showToast(MainActivity.this, "登录失败!");
} else {
ToastUtil.showToast(MainActivity.this, result.toString());
}
}
};
private void simpleSystemLogin() {
SimpleSystemLogin.login("Hello", "123", onHttpResultListener);
}
private void simpleOkHttpLogin() {
SimpleOkHttpLogin.loginSync("Hello", "123", onHttpResultListener);
}
private void simpleRetrofitLoginSync() {
SimpleRetrofitLogin.loginSync("Hello", "123", onHttpResultListener);
}
private void simpleRetrofitLoginAsync() {
SimpleRetrofitLogin.loginAsync("Hello", "123", onHttpResultListener);
}
// 发送get请求
private void simpleRetrofitLoginGetAsync() {
SimpleRetrofitLogin.loginGet("Hello", "123", onHttpResultListener);
}
private void simpleRetrofitLoginField() {
SimpleRetrofitLogin
.loginPostField("Hello", "123", onHttpResultListener);
}
private void simpleRetrofitLoginGetQueryMap() {
SimpleRetrofitLogin.loginGetQueryMap("Hello", "123",
onHttpResultListener);
}
// 上传图片
private void simpleRetrofitUploadImage() {
String imagePath = FileManager.getRecordFile().getAbsolutePath()
+ "/paint.png";
SimpleRetrofitUploadImage.uploadImage(imagePath, onHttpResultListener);
}
// 上传图片
private void simpleRetrofitLoginGson() {
SimpleRetrofitGson.loginGson("Hello", "123", onHttpResultListener);
}
private void simpleRetrofitConvertXml() {
SimpleRetrofitXml.getUserList();
}
private void simpleRetrofitRxJava() {
SimpleRetrofitRxJava.login("Hello", "123", onHttpResultListener);
}
private void simpleMyRetrofitTest() {
MyRetrofitTest.login("Hello", "123", onHttpResultListener);
}
}
一二三四需要下载的夹包
第二部分
先看下接口,我们定义了两个方法,登陆与获取用户信息
public interface IService {
@POST("login/json")
Observable<BaseResult> loginWithRx(@Body UserParam parm);
@GET("user/{id}")
Observable<User> getUserInfoWithRx(@Path("id") int user_id);
}
我们现在有这个需求,首先实现登陆功能,然后获取用户的信息,我们当然可以这么写
除此之外我们还可以使用flatmap操作符
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(testurl)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
final IService api = retrofit.create(IService.class);
api.loginWithRx(new UserParam("wangdidi", "123456")).flatMap(new Function<BaseResult, ObservableSource<User>>() {
@Override
public ObservableSource<User> apply(BaseResult baseResult) throws Exception {
return api.getUserInfoWithRx(baseResult.getUser_id());
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<User>() {
@Override
public void accept(User user) throws Exception {
Toast.makeText(MainActivity.this, "username:" + user.getUserName(), Toast.LENGTH_LONG).show();
}
});
}
第三部分
我们先看下服务端的要求
看下接口信息
// 编辑团队信息
@POST(RunningGroupURL.POST_EDIT_GROUP_INFO)
Observable<PublicResponseEntity<Void>> postEditGroupInfo(@Body EditGroupInfoParams stepsGroupRequest, @QueryMap Map<String, String> params);
这是EditGroupInfoParams类
package com.taikang.app.runninggroup.params;
/**
* Created by renzhijiang on 2018/9/30.
*/
public class EditGroupInfoParams {
/**
* groupName : string
* words : string
*/
private String groupName;
private String words;
public String getGroupName() {
return groupName;
}
public void setGroupName(String groupName) {
this.groupName = groupName;
}
public String getWords() {
return words;
}
public void setWords(String words) {
this.words = words;
}
}
// 编辑团队信息
public Observable<PublicResponseEntity<Void>> postEditGroupInfo(EditGroupInfoParams editGroupInfoParams) {
//这个类里面包含userId和token
HashMap<String, String> params = UserManager.getUserIdAngTokenParamsMap();
return mServiceApi.postEditGroupInfo(editGroupInfoParams,params).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread());
}
看下我们的调用
EditGroupInfoParams params = new EditGroupInfoParams();
params.setGroupName(groupName);
params.setWords(groupSlogan);
addDispose(runningGroupViewMoudle.postEditGroupInfo(params).subscribe(new Consumer<PublicResponseEntity<Void>>() {
@Override
public void accept(PublicResponseEntity<Void> data) throws Exception {
if (null != data) {
int code = data.getCode();
if (code == 0) {
ToaUtils.show(mContext, "团队信息保存成功");
Intent intent = new Intent(mContext, QuarterChampionActivity.class);
startActivity(intent);
finish();
} else if (code == -1) {
// 登录过期
} else {
ToaUtils.show(mContext, "信息保存失败,请重试");
}
} else {
ToaUtils.show(mContext,"网络走丢了,请检查网络");
}
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
ToaUtils.show(mContext,"网络走丢了,请检查网络");
}
}));
}