简单的demo-MVP模型+Rxjava+Retrofit
这几天辞职在家,找工作别人嫌我太菜,只能在家敲敲demo,坐等面试通知,鸭梨山大。
这几天出去面试,面试官一开口就是Rxjava,mvp模型,说真的,这东西我在开发中真的还没用(1是因为我太菜,2是以前公司的产品没有这需求),当然,以前也敲过一些demo,但是面试官问起来,真的不知道怎么回答,于是,这几天便在家又好好的学习一遍,敲敲demo,加强记忆,免得下次面试还是这样。好了,言归正传,一起来看一下我的这个demo。
首先,AS添加依赖
demo 的视图很简单,两个输入框,一个登陆按钮,以及一个TextView,既然运用了MVP模型,demo 的包肯定要分层,这就不展示了(大家都会),mvp模型的概念,我也不说了,百度一大把,我只聊我这个demo,下面,逐步讲解
这是我定义的View层的接口,分别获取用户名,用户密码,以及展示登陆成功和登陆失败的信息,以及网络请求失败的信息,View层,是我们与用户交互的界面,那便让LoginActivity来实现它,从写上面的方法。
这边是我LoginActivity需要实现的代码,是不是蛮简单,activity的代码一目了然。View层的代码都在这儿了,下面来看一看presenter层的代码。

presenter层的代码也是一个接口和一个实现类,在接口中定义了一个login()方法,在前面的Activity 中,实例化了一个LoginPersenter对象,然后调用用了login()方法,下图。在presenter的login方法内部再次调用model的login()方法(login有点多,大家见谅),这是不是就把事物逻辑放到model层去处理,而Activity 不参加逻辑处理的过程,这便达到了解耦的目的,关于model层的代码我们后面讲,大家会问,我请求成功后,逻辑怎么怎么回调,activity怎么知道事件结果了?大家看到没有,我的presenter实现了一个HttpListener的接口,里面有success()和failed()方法,为了代码的复用,我定义的一个泛型,这是为了以后功能的扩展。在success方法中,mLoginView.showLoginMsg();mLoginView是谁?这不就是LoginActivity本身嘛,因为LoginActivity实现了LoginView,并且实例化LoginPresenter对象时,传入了this,这样就将我网络请求成功后的javaben对象回调给了Activity,是不是很神奇?
好,presenter层聊完了,咱们来看看model的代码,不多说,贴代码
model层,用于具体的逻辑实现,当然,还是一个login方法,传入用户名,密码,以及HttpListener的实现类,这个大家应该都能看懂,login 方法中,就是我们的具体网络请求,好现在我们们来聊聊Rxjava 加Retrofit的简单使用,还是贴代码。
public class HttpResult<T> {
private int resultCode;
private T subjects;
private String message;
}
首先,定义了一个HttpResult的基类,并且带泛型,好处不多说,大家都懂,Retrofit要使用,首先要定义一个service接口,然后我定义了一个login 方法,@Header,是头部信息,@QueryMap,是我们的post请求的参数集合,返回值Observable<HttpResult<loginBean>>,这便是我们的观察对象,里面是我们需要的javabean。
public interface LoginService {
@POST("login.do")
Observable<HttpResult<LoginBean>> login(@Header("loginTime") String loginTime,
@QueryMap Map<String, String> map
);
}
然后我们就需要去初始化Retrofit,下面是构造函数,里面初始化了OKHttp,在这儿,还可以给OKHttp添加缓存,过滤cook,头部信息,我们就不多说了,大家有这个方面的需求,可以去找度娘。在初始化Retrofit 的时候,定义了gson 的解析器,有了这个,我们直接拿到javabean 对象,是不是很方便,addCallAdapterFactory(RxJavaCallAdapterFactory.create())便是加入了Rxjava,Rxjava的核心便是切换线程以及变换,下面看代码。关于切换线程以及变换具体的使用大家可以去看看帖,我自己对这个也是一知半解,免得误导大家。
public HttpInstance() {
OkHttpClient.Builder builder = new OkHttpClient.Builder();
mRetrofit = new Retrofit.Builder()
.baseUrl(BASEPATH)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(builder.build())
.build();
mLoginService = mRetrofit.create(LoginService.class);
}
public void login(Subscriber<LoginBean> subscriber, String time, Map<String, String> map) {
//map用来变换
mLoginService.login(time, map).map(new Func1<HttpResult<LoginBean>, LoginBean>() {
@Override
public LoginBean call(HttpResult<LoginBean> httpResult) {
if (httpResult.getResultCode() != 1)
return null;
return httpResult.getSubjects();
}
}).subscribeOn(Schedulers.io())//切换线程
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(subscriber);
}
demo的代码部分,就说这么多,解释不清楚,大家见谅,关于其实开发中,不论MVC,还是MVP模型,唯一目的就是解耦,MVP看着麻烦,其实只要多用几次,自然会了。关于RXjava 与Retrofit的使用,不是很清楚的同学建议去多看看帖,这是以后的趋势,哦,对了,关于请求的服务器,我是用的Servlet加tomcat自己搭的一个,代码很粗糙,就不展示了,大家有兴趣也可以自己玩玩。
半夜了,要睡觉了,祈求上天,但愿明天有面试电话来,再不工作,揭不开锅了,本人在武汉,大家有工作介绍的,@一下啊。

浙公网安备 33010602011771号