先来简单了解下mvp模式,mvp是由model、view和presenter构成。model负责处理数据模型,view负责给视图控件view提供接口,presenter将model和view联系起来。如图:
retrofit对okhttp进行了封装,简化了好多代码,不得不说,真是很棒!我这里主要用retrofit进行网络请求,用rxjava处理网络请求的回调;
这是我的项目目录:
如何单独的使用retrofit和rxjava我就不说了,相信很多同学都已经很清楚了。
我做的的一个简单的登录demo。项目由API(接口(retrofit形式的uri))层、interface(网络回调的接口)层、model(数据模型)层、presenter(将view和model联合起来)层、request(网络请求的管理类)层、view(给view控件提供接口)层,构成。
Api接口
public interface Apis<T> {
@POST("yq/login")
Observable<T> login(@Query("username") String username, @Query("password") String password);
public String baseUrl = "";
}
网络回调ResponseNetWorkInterface 接口
/**
*
* 处理网络返回数据的接口
*/
public interface ResponseNetWorkInterface<T> {
public void onStart(int resquestTag);
public void onError(Throwable t,int resquestTag);
public void onCompleted(int resquestTag) ;
public void onNext(T t,int resquestTag) ;
}
自定义观察者,给网络回调提供入口,requesTag是请求标识用来区分请求
public class MySubscriber extends Subscriber<BaseModel> {
private ResponseNetWorkInterface responseNetWorkInterface;
private int resquestTag;
public MySubscriber(ResponseNetWorkInterface responseNetWorkInterface,int resquestTag){
this.responseNetWorkInterface = responseNetWorkInterface;
this.resquestTag = resquestTag;
}
@Override
public void onStart() {
responseNetWorkInterface.onStart(resquestTag);
}
@Override
public void onCompleted() {
responseNetWorkInterface.onCompleted(resquestTag);
}
@Override
public void onError(Throwable e) {
responseNetWorkInterface.onError(e,resquestTag);
}
@Override
public void onNext(BaseModel baseModel) {
responseNetWorkInterface.onNext(baseModel,resquestTag);
}
}
model数据模型,这里就列出一个
public class BaseModel<T> implements Serializable{
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
private int code;
private String msg;
}
presenter
public class BaseModel<T> implements Serializable{
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
private int code;
private String msg;
}
presenter实现ResponseNetWorkInterface接口处理回调,并将view数据引进过来,通过NetWorkManager.getNewWorkManger().request(this,requestTag,loginInforInterface)这句代码请求网络,参数在loginInforInterface里封装着;
public class LoginPresenter implements ResponseNetWorkInterface<LoginBase> {
private LoginInforInterface loginInforInterface;
public LoginPresenter(LoginInforInterface loginInforInterface){
this.loginInforInterface = loginInforInterface;
}
/**
* 登录
* @param requestTag
*/
public void login(int requestTag){
NetWorkManager.getNewWorkManger().request(this,requestTag,loginInforInterface);
}
@Override
public void onStart(int resquestTag) {
}
@Override
public void onError(Throwable t, int resquestTag) {
}
@Override
public void onCompleted(int resquestTag) {
}
@Override
public void onNext(LoginBase loginBase,int resquestTag) {
}
}
request管理网络请求,创建一个单例的网路请求入口,创建时就将retrofit相关注册完成,通过调用request实现网络请求
public class NetWorkManager {
public static NetWorkManager netWorkManager;
private Retrofit retrofit;
private Apis apis;
private NetWorkManager(){
//初始化把retrofit和rxjava结合起来
retrofit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.baseUrl(Apis.baseUrl)
.build();
apis = retrofit.create(Apis.class);
}
/**
* 创建一个单例的网路请求入口
* @return
*/
public static NetWorkManager getNewWorkManger(){
synchronized (NetWorkManager.class){
if(netWorkManager==null){
netWorkManager = new NetWorkManager();
}
}
return netWorkManager;
}
/**
*
* @param responseNetWorkInterface
* @param requestTag
* @param loginInforInterface
* @param <T>
* @return
*/
public <T extends BaseModel> Subscriber request(ResponseNetWorkInterface<T> responseNetWorkInterface, int requestTag, LoginInforInterface loginInforInterface){
MySubscriber mySubscriber = new MySubscriber(responseNetWorkInterface,requestTag);
apis.login(loginInforInterface.getUserName(),loginInforInterface.getPassWord())
.subscribeOn(Schedulers.io())
.map(new BaseFunc<T>())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(mySubscriber);
return mySubscriber;
}
}
view接口
public interface LoginInforInterface {
public String getUserName();
public String getPassWord();
}
主activity代码非常简洁通过LoginPresenter loginPresenter = new LoginPresenter(this);
loginPresenter.login(1);就实现了网络请求
public class MainActivity extends AppCompatActivity implements LoginInforInterface{
private EditText et_name;
private EditText et_password;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_name = (EditText)findViewById(R.id.et_name);
et_password = (EditText)findViewById(R.id.et_password);
}
//登录
public void login(View v){
LoginPresenter loginPresenter = new LoginPresenter(this);
loginPresenter.login(1);
}
@Override
public String getUserName() {
return et_name.getText().toString();
}
@Override
public String getPassWord() {
return et_password.getText().toString();
}
}
gradel配置:
compile 'io.reactivex:rxjava:x.y.z'
compile 'io.reactivex:rxandroid:1.0.1'
compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.2'
总结:mvp模式让代码清晰整洁了很多,但本人感觉用起来,不是很舒服,有点小麻烦,retrofit只能说是相当好用,推荐大家使用。
项目地址: