项目结构:
以上是可参考的一个项目目录结构
1.介绍
MVP模式的介绍这里就不仔细讲解了,这里给出一个链接
Retrofit是Square公司的又一个精品,具体介绍可以看官网
RxJava是最近比较流行的响应式编程,本篇文章是介绍使用实例,这些框架的具体用法可以参考使用文档等其他资料
2.实例讲解
Mvp模式不同于传统的MVC模式,它将model层和view层完全的解耦,利用Presenter来处理数据和视图的交互。做到了数据与界面的分离,与传统MVC相比,大大降低了view层的代码量。
所以项目大致思路是:presenter层获取view层的参数交给model层,并且model层获取presenter层传过来的subcriber来构造一个rxjava+retrofit方式的的网络请求,然后presenter层在回调的subcriber中获取数据,传递回view层,用于界面的显示交互使用。其中对retrofit网络请求框架进行了简单的封装。
3.代码块
说了这么多,没有代码也是一脸懵逼。所以,上干货!!!!!
先展示retrofit的封装:
项目对需要用到retrofit+rxjava的依赖:
compile 'com.squareup.retrofit2:retrofit:2.2.0'
compile 'com.alibaba:fastjson:1.1.34.android'
compile 'org.ligboy.retrofit2:converter-fastjson-android:2.1.0'
compile 'io.reactivex:rxjava:1.1.0'
compile 'io.reactivex:rxandroid:1.1 .0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.2.0
其中使用的fastjson来作为结果的解析库
这里是我在自己的本地服务器环境写了两个测试接口,包了get和post两种请求方式的测试接口:
public interface CloudAPIService {
@Multipart
@POST("/api_user/add_repair.json")
Observable<ResponseBody> postAddRepair(@Part("teacher_phone") String phone, @Part("receiver_id") String receiverid, @Part("title") String title, @Part("attachment") File file);
// @FormUrlEncoded
@GET("/ztemp/testpost.json")
Observable<TempBean> postStr(@Query("str") String name);
}
http访问的retrofit封装:
public class HttpMethods {
private static final String TAG = "HttpMethods";
private static final String baseUrl = "http://192.168.0.109:8000/";
private static HttpMethods instance;
private Retrofit retrofit;
private CloudAPIService apiService;
private static OkHttpClient.Builder httpClientBuilder;
private static CookiesManager cookiesManager;
public static void initCookieHandler(Context context) {
httpClientBuilder = new OkHttpClient.Builder();
cookiesManager = new CookiesManager(context);
httpClientBuilder.connectTimeout(5, TimeUnit.SECONDS).cookieJar(cookiesManager);
}
public static void logout() {
if (cookiesManager != null) cookiesManager.removeAllCookies();
}
private HttpMethods(Context context) {
retrofit = new Retrofit.Builder()
.client(httpClientBuilder.build())
.addConverterFactory(FastJsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.baseUrl(baseUrl).build();
apiService = retrofit.create(CloudAPIService.class);
}
public static HttpMethods getInstance(Context context) {
if (instance == null) instance = new HttpMethods(context);
return instance;
}
public void post(Subscriber<ResponseBody> subscriber, String phone, String receiveId, String title, File file) {
apiService.postAddRepair(phone, receiveId, title, file).subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(subscriber);
}
public void getStr(Subscriber<TempBean> subscriber, String name) {
apiService.postStr(name).subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(subscriber);
view层:写好界面可能的所有控件交互的接口,在activity中去实现,在presenter中去调用
public interface IMainView {
void showToast(String msg);
String getEtContent();
void setEtResult(String msg);
}
model层:处理数据的层,处理结果返回给presenter,presenter再传递给view层。
public class MainModel {
private Context context;
public MainModel(Context context) {
this.context = context;
}
public void postResult(Subscriber<TempBean> result, String name) {
HttpMethods.getInstance(context).postStr(result, name);
}
}
presenter:连接model层与view层的一个中间层
public class MainPresenter {
private static final String TAG = "MainPresenter";
private MainModel mModel;
private IMainView mView;
public MainPresenter(Context context, IMainView mView) {
this.mView = mView;
mModel = new MainModel(context);
}
public void postNameAndsetResult() {
if (TextUtils.isEmpty(mView.getEtContent())) mView.showToast("内容不可为空");
else mModel.postResult(new Subscriber<TempBean>() {
@Override
public void onCompleted() {
mView.showToast("completed!");
}
@Override
public void onError(Throwable e) {
Log.i(TAG, "onError: " + e);
mView.setEtResult(e.getMessage());
}
@Override
public void onNext(TempBean tempBean) {
Log.i(TAG, "onNext: " + tempBean);
mView.setEtResult(""+tempBean.getA());
}
}, mView.getEtContent());
}
}