本文基于MVP整理出了一套适合本身的架构php
该系列文章会不断更新Android项目开发中一些好的架构和小技巧java
系列一 Android架构系列-基于MVP建立适合本身的架构
系列二 Android架构系列-如何优美的写Intent
系列三 Android架构系列-开发规范
系列四 Android架构系列-封装本身的okhttp
系列五 Android架构系列-MVP架构的实际应用android
MVP架构是当前比较成熟的Android架构,还有其余架构好比最初始的MVC和MVVM。MVC相对于较为落后,MVVM使用DataBind,普及性不如MVP。因此最终决定本身设计的框架是基于MVP思想进行总结的框架。git
选择MVP框架的缘由之一也是google官方的示例中MVP sample已是完成,证实google官方对于MVP的认可度。github
官方项目地址:
github.com/googlesampl…api
一个较为详细的官方项目源码解析的文章:
www.infoq.com/cn/articles…缓存
具体的MVP架构相关文章网上已经很是多了,具体的能够自行查找。MVP的存在主要是因为普通MVC架构会致使项目中activity过于臃肿,当项目愈来愈大后,代码可读性大大下降。服务器
MVP的思想是将activity做为view层,只负责与xml的渲染和监听事件,具体处理数据逻辑放到一个新定义的Present层。减小了activity负责的事情。而且能够强迫开发者养成分模块功能开发的思想。开发前设计好功能模块,而不是像之前同样写流水帐同样写代码。从头写到尾。网络
本身根据MVP的思想和一些好的源码总结了一套适合字的框架。真正的架构是依赖义务存在的,因此建议你们能总结出适合本身项目的代码。架构
在目录分配上决定采用根据功能模块进行划分,而不是全部activty在一个目录的方法。相似google的例子:
缘由几点:
具体例子分配以下:
Model层中又能够分为Api层和Cache层。
主要是网络获取数据信息等接口。
使用了本身二次封装过的Retrofit+Okhttp+Gson组合。详细能够参见文章:www.jianshu.com/p/283d1a7a0…
示例SampleApi:
public class SampleApi extends BaseApi {
private static final String mBaseUrl = "http://192.168.3.1/";
private ApiStore mApiStore;
public SampleApi() {
super(mBaseUrl);
mApiStore = mRetrofit.create(ApiStore.class);
}
/** * 获取xxx数据 * @param uid * @param callback */
public void getSampleInfo(String uid, ApiCallback<GetSampleInfoRet> callback) {
Call<GetSampleInfoRet> call = ((ApiStore)mApiStore).getSampleInfo(uid);
call.enqueue(new RetrofitCallback<GetSampleInfoRet>(callback));
}
public interface ApiStore {
@FormUrlEncoded
@POST("test_retrofit.php")
Call<GetSampleInfoRet> getSampleInfo(@Field("uid") String uid);
}
}复制代码
本地缓存部分数据。
使用了ASimpleCache缓存开源代码。详细能够参见文章:www.jianshu.com/p/25c107ed7…
示例SampleCache:
public class SampleCache extends BaseCache {
private final String KEY_NEWEST_SAMPLE_INFO = "sample_newest_info";
public SampleCache(Context context) {
super(context);
}
/** * 保存sample信息 * @param serializable */
public void saveNewestSample(Serializable serializable) {
mCache.put(KEY_NEWEST_SAMPLE_INFO, serializable);
}
/** * 获取sample信息 * @return */
public SampleInfo getNewestSampleInfo() {
return (SampleInfo) mCache.getAsObject(KEY_NEWEST_SAMPLE_INFO);
}
/** * 移除缓存 */
public void removeNewestSampleInfo() {
mCache.remove(KEY_NEWEST_SAMPLE_INFO);
}
}复制代码
实体化数据类。
Presenter层又能够分为Contract协议接口,和具体的Presenter处理
负责约定view层和presenter层的接口,view和presenter实现相应接口,最终达到解耦的目的。
SampleContract示例:
public interface SampleContract {
interface View {
void showSample(SampleInfo sampleInfo); //显示sample
void errorGetSample(String msg); //显示错误信息
}
interface Presenter {
void getNewestSample(); //获取当前最新的xxx
}
}复制代码
负责从model层获取数据、整理数据、行为处理等。处理后调用view显示数据。
SamplePresenter示例:
public class SamplePresenter extends BasePresenter implements SampleContract.Presenter {
private SampleContract.View mView;
private SampleApi mApi;
private SampleCache mCache;
public SamplePresenter(SampleContract.View view) {
mView = view;
mApi = new SampleApi();
mCache = new SampleCache(GlobalApp.getInstance().getContext());
}
@Override
public void getNewestSample() {
//先从缓存获取
SampleInfo sampleInfo = mCache.getNewestSampleInfo();
if(sampleInfo == null) {
//从网络获取
mApi.getSampleInfo("uid", new BaseApi.ApiCallback<GetSampleInfoRet>() {
@Override
public void onSuccess(GetSampleInfoRet ret) {
//缓存
mCache.saveNewestSample(ret.data);
//页面显示
mView.showSample(ret.data);
}
@Override
public void onError(int err_code, String err_msg) {
//服务端返回错误码
mView.errorGetSample(err_msg);
}
@Override
public void onFailure() {
//网络请求或者解析错误
mView.errorGetSample("服务器请求错误");
}
});
} else {
mView.showSample(sampleInfo);
}
}
}复制代码
即平时所说的activity、fragment等。继承自SampleContract的view接口,只负责UI相关显示刷新等。因为拉出了presenter层,view层的代码变得极为清晰
SampleActivity示例:
public class SampleActivity extends BaseActivity implements SampleContract.View {
@BindView(R.id.txtName)
TextView txtName;
@BindView(R.id.imgAvatar)
ImageView imgAvatar;
private SampleContract.Presenter mPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sample);
ButterKnife.bind(this);
mPresenter = new SamplePresenter(this);
}
@Override
public void showSample(SampleInfo sampleInfo) {
txtName.setText(sampleInfo.sample_name);
Glide.with(this)
.load(sampleInfo.avatar)
.into(imgAvatar);
}
@Override
public void errorGetSample(String msg) {
//错误信息
}
}复制代码
以上代码Github地址:
github.com/tsy12321/Ba…
注:该项目会作成一个基础的项目框架,包含各类封装好的工具,底层库和MVP架构,还在不断更新中,欢迎关注提Issue!
更多文章关注个人公众号