活在當(dāng)下先煎,別在懷念過去或憧憬未來中浪費(fèi)掉今天的生活。因?yàn)槊魈煸絹碓缴偾山В蛱煸絹碓蕉啵?/p>
MVP
所謂MVP(Model-View-Presenter)模式薯蝎。是將APP的結(jié)構(gòu)分為三層:
view - 界面邏輯層
- 提供UI交互
- 在presenter的控制下修改UI。
- 將業(yè)務(wù)事件交由presenter處理
presenter - 業(yè)務(wù)邏輯層
- 對UI的各種業(yè)務(wù)事件進(jìn)行相應(yīng)處理谤绳。也許是與Model層交互占锯,也許自己進(jìn)行一些計(jì)算,也許控制后臺Task缩筛,Service
- 對各種訂閱事件進(jìn)行響應(yīng)消略,修改UI。
- 臨時(shí)存儲頁面相關(guān)數(shù)據(jù)歪脏。
model - 數(shù)據(jù)模型層
- 從網(wǎng)絡(luò)疑俭,數(shù)據(jù)庫粮呢,文件婿失,傳感器,第三方等數(shù)據(jù)源讀寫數(shù)據(jù)啄寡。
- 對外部的數(shù)據(jù)類型進(jìn)行解析轉(zhuǎn)換為APP內(nèi)部數(shù)據(jù)交由上層處理豪硅。
- 對數(shù)據(jù)的臨時(shí)存儲,管理,協(xié)調(diào)上層數(shù)據(jù)請求
3674055-73a9eba4421bf5c7.png
舉例說明:實(shí)現(xiàn)一個(gè)粉絲列表
public interface FansCallback{
/*
* 搜索成功
* */
void onSuccess(List<GlobalUserBean> list);
/*
* 搜索失敗
* */
void onFailure(int code, String msg);
}
這個(gè)接口的作用是:當(dāng)prsenter層中數(shù)據(jù)相應(yīng)是挺物,view層回調(diào)懒浮,修改當(dāng)前UI或者相應(yīng)數(shù)據(jù),如果你對接口或者接口回調(diào)不是很理解,請看這篇文章
接口
接下來看看view層的代碼的實(shí)現(xiàn)
/*
*
* 粉絲列表
*
* */
public class FansListActivity extends TCBaseActivity implements UIInterface, FansListMgr.FansCallback {
@Bind(R.id.rv_fans)
RecyclerView mRvFansList;
@Bind(R.id.sw_fans)
SwipeRefreshLayout mSwipeRefreshLayout;
@Bind(R.id.view_tac)
TCActivityTitle mTCActivityTitle;
//無數(shù)據(jù)背景圖
@Bind(R.id.ll_not_data)
LinearLayout mLlNotData;
private FansListMgr mFansListMgr;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fans_list);
ButterKnife.bind(this);
initView();
initData();
}
@Override
public void initData() {
mFansListMgr = FansListMgr.getInstance();//presenter對象的實(shí)現(xiàn)
mFansListMgr.setFansCallback(this);//接口回調(diào)的注入
mFansListMgr.getFans(UserInfoMgr.getInstance().getUid());//調(diào)用presenter類當(dāng)中獲取粉絲數(shù)目的實(shí)現(xiàn)
}
@Override
public void initView() {
mRvFansList.setLayoutManager(new LinearLayoutManager(this));
//下拉刷新
mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
mFansListMgr.getFans(UserInfoMgr.getInstance().getUid());
}
});
mTCActivityTitle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
@Override
public void onSuccess(List<GlobalUserBean> list) {
mSwipeRefreshLayout.setRefreshing(false);
mRvFansList.setAdapter(new FansAdapter(this,list));
if(list.size() == 0){
mLlNotData.setVisibility(View.VISIBLE);
}else{
mLlNotData.setVisibility(View.GONE);
}
}
@Override
public void onFailure(int code, String msg) {
mLlNotData.setVisibility(View.VISIBLE);
}
}
其中UIInterface是一個(gè)接口,主要負(fù)責(zé)view類初始化view跟初始化數(shù)據(jù)
public interface UIInterface {
void initData();
void initView();
}
接下來看看prsenter類是怎么實(shí)現(xiàn)的
public class FansListMgr {
private final static String TAG = FansListMgr.class.getSimpleName();
/*單例模式生成presenter類*/
private static class FansListMgrHolder{
static FansListMgr instance = new FansListMgr();
}
private FansCallback mFansCallback;
public FansListMgr() {
}
/*接口回調(diào)的方法*/
public void setFansCallback(@NonNull FansCallback callback){
this.mFansCallback = callback;
}
/*
*
* 請求獲取粉絲
* */
public void getFans(String uid){
AppClient.ApiStores apiStores = AppClient.retrofit().create(AppClient.ApiStores.class);
Call<ResponseJson<GlobalUserBean>> call = apiStores.requestFansList(uid,uid,"1");
call.enqueue(new Callback<ResponseJson<GlobalUserBean>>() {
@Override
public void onResponse(Call<ResponseJson<GlobalUserBean>> call, Response<ResponseJson<GlobalUserBean>> response) {
if(AppClient.checkResult(response)){
if(mFansCallback != null){
mFansCallback.onSuccess(response.body().getData().getInfo());//調(diào)用接口類當(dāng)中的方法,回調(diào)view層實(shí)現(xiàn)的方法呢灶,進(jìn)行數(shù)據(jù)交互或者打到更改UI的目的
}
}
}
@Override
public void onFailure(Call<ResponseJson<GlobalUserBean>> call, Throwable t) {
if(mFansCallback != null)
mFansCallback.onFailure(0,"獲取粉絲列表失敗");
}
});
}
public static FansListMgr getInstance(){
return FansListMgrHolder.instance;
}
public interface FansCallback{
/*
* 搜索成功
* */
void onSuccess(List<GlobalUserBean> list);
/*
* 搜索失敗
* */
void onFailure(int code, String msg);
}
}
我習(xí)慣把契約類這個(gè)接口卸載presenter類當(dāng)中自阱,這樣做的目的是接口本來代碼量不多放在presenter類當(dāng)中減少接口的創(chuàng)建管理起來比較方便
接下來就是model層數(shù)據(jù)響應(yīng)的封裝在此就不一一在這里展示了
這是本人對mvp模式的簡單的看法,如果有不妥的地方澄暮,望各位大牛批評指正
http://www.reibang.com/p/3e3459d0fe25
http://blog.csdn.net/lmj623565791/article/details/46596109