今天估計(jì)是這學(xué)期最后一天花這么多時(shí)間在Android上了,因?yàn)榻酉聛淼囊欢螘r(shí)間里酵紫,我將會(huì)不斷的考試不斷的做實(shí)驗(yàn)不斷的課程設(shè)計(jì)扒最,而偏偏我是個(gè)學(xué)粉丑勤。。學(xué)渣已經(jīng)形容不了我了吧趣,現(xiàn)在的狀態(tài)真的是渣都不剩了法竞。不過還好還好有自己喜歡的事,有事沒事可以看看書看看博客撩撩妹强挫。今天寫一下關(guān)于MVP架構(gòu)的岔霸,我盡量將我這個(gè)初學(xué)者思考過程說清楚。不扯淡先看看今天的demo的預(yù)覽圖俯渤。
開波
本來我也想先給大家說說什么是MVC然后MVP怎樣來的呆细,然后摔出一大堆官方的文檔,接著說自己的感受八匠。但是這些基本那些介紹MVP的博文都會(huì)說到絮爷,我就不說了诡曙,因?yàn)?strong>MVC的話,個(gè)人覺得你在寫大一點(diǎn)的Demo時(shí)自然而然的就會(huì)抽取提煉略水,那大概就是MVC了吧价卤?大差不差。那么什么是MVP呢渊涝?下面po圖(第一次畫圖我知道丑不過先將就著吧):
上面的圖其實(shí)已經(jīng)說清楚了什么是MVP
- View層僅負(fù)責(zé)加載視圖(Activity or Fragment)與用戶交互(鍵盤輸入),不處理業(yè)務(wù)邏輯慎璧。
- Model層負(fù)責(zé)處理業(yè)務(wù)。
-
Presenter層負(fù)責(zé)控制兩者之間的交往跨释?(用這個(gè)次準(zhǔn)確嗎)胸私,因此Presenter必須揣有View和Model的實(shí)例。
要點(diǎn)就這三點(diǎn)鳖谈,下面在代碼中說明吧岁疼。
中場
看代碼總是最輕松的,下圖即為demo的java文件缆娃。
我先介紹一下各部分的作用:
-
config因?yàn)榇舜雾槑?fù)習(xí)了一溜
Retorfit
,所以CallService是Retrofit
的接口捷绒,Config則是我在聚合數(shù)據(jù)拿的一個(gè)新聞APi。在此謝謝阿里媽媽和馬云爹爹贯要。 - model是業(yè)務(wù)層暖侨,里面有NewInfo這個(gè)接收解析后Json數(shù)據(jù)的實(shí)體bean,NewLogic則是業(yè)務(wù)邏輯處理類崇渗,INewCallBack是一個(gè)監(jiān)聽網(wǎng)絡(luò)請求后的回調(diào)字逗。
- presenter是用以給model和view交互的中間人
- view里面有一個(gè)定義給MainActivity使用的接口ViewLogic,通過此接口我們可以給界面添加交互所需的方法宅广。同時(shí)因?yàn)榻换バ枰獊碜?strong>model的數(shù)據(jù)葫掉,但是并不能直接拿到所以可以拿到Presenter實(shí)例間接獲取數(shù)據(jù)。當(dāng)然由圖可知通過此接口我們可以在Presenter拿到View的實(shí)例跟狱。
下面看代碼:
model層
- NewLogic.java
/* 業(yè)務(wù)邏輯:分析可知功能僅僅為申請新聞數(shù)據(jù)*/
public class NewsLogic {
private CallService callService;
public NewsLogic() {
Retrofit mRetrofit = new Retrofit.Builder().baseUrl(Config.BASE_URL)
.addConverterFactory(GsonConverterFactory.create()).build();
callService = mRetrofit.create(CallService.class);
}
public void getNew(Map<String,String> map, final INewCallBack callBack){
Call<NewInfo> call = callService.getNewInfo(map);
call.enqueue(new Callback<NewInfo>() {
@Override
public void onResponse(Call<NewInfo> call, Response<NewInfo> response) {
if (response.isSuccessful()){
callBack.onSucceed(response);
}else{
callBack.onFailure("獲取新聞信息失敗");
}
}
@Override
public void onFailure(Call<NewInfo> call, Throwable t) {
callBack.onFailure("獲取新聞信息失敗");
}
});
}
}```
* **NewInfo**這個(gè)類是通過**GsonFormat**解析的太長所以在這里不放了俭厚。
**View層**
**ViewLogic.java**
public interface ViewLogic {
//顯示加載bar
void showProgress();
//隱藏加載bar
void hideProgress();
//顯示新聞內(nèi)容
void showInfo(NewInfo newInfo);
//獲取失敗時(shí)操作
void showError(String 獲取新聞信息失敗);
}```
MainActivity.java
public class MainActivity extends AppCompatActivity implements ViewLogic {
//一些聲明
private Button mButton;
private Presenter mPresenter = new Presenter(this);/*獲取Presenter實(shí)例間接貨物model數(shù)據(jù)*/
private ProgressBar mProgress;
private TextView mTitle,mTime;
private ImageView img;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();/*初始化控件*/
}
private void init() {
mTitle = (TextView) findViewById(R.id.title);
mTime = (TextView) findViewById(R.id.time);
img = (ImageView) findViewById(R.id.img);
mProgress = (ProgressBar) findViewById(R.id.progress);
mButton = (Button) findViewById(R.id.btn_get);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mPresenter.getInfo();/*獲取新聞數(shù)據(jù)*/
}
});
}
@Override
public void showProgress() {
mProgress.setVisibility(View.VISIBLE);/*顯示加載條*/
}
@Override
public void hideProgress() {
mProgress.setVisibility(View.GONE);/*隱藏加載條*/
}
/***
* 顯示新聞數(shù)據(jù)
* @param newInfo
*/
@Override
public void showInfo(NewInfo newInfo) {
mTitle.setText(newInfo.getResult().getData().get(0).getTitle());
mTime.setText(newInfo.getResult().getData().get(0).getDate());
Picasso.with(this).load(newInfo.getResult().getData().get(0).getThumbnail_pic_s()).into(img);
}
/**
* 獲取出錯(cuò)時(shí)
* @param 獲取新聞信息失敗
*/
@Override
public void showError(String 獲取新聞信息失敗) {
Toast.makeText(this, "獲取新聞信息失敗", Toast.LENGTH_SHORT).show();
}
}```
* Activity僅僅用以加載視圖和與用戶交互沒有過多的業(yè)務(wù)邏輯處理。
**Presenter層**
**Presenter.java**
public class Presenter {
//y必須擁有molde層和view層實(shí)例
private NewsLogic mNewsLogic;
private ViewLogic mViewLogic;
public Presenter(ViewLogic viewLogic) {
mViewLogic = viewLogic;
mNewsLogic = new NewsLogic();
}
//功能只有獲取數(shù)據(jù)
public void getInfo(){
mViewLogic.showProgress();
HashMap<String, String> map = new HashMap<>();
map.put("type","tiyu");
map.put("key", Config.KEY);
mNewsLogic.getNew(map, new INewCallBack() {
@Override
public void onSucceed(Response<NewInfo> response) {
NewInfo newInfo = response.body();
mViewLogic.hideProgress();
mViewLogic.showInfo(newInfo);
}
@Override
public void onFailure(String 獲取新聞信息失敗) {
mViewLogic.hideProgress();
mViewLogic.showError(獲取新聞信息失敗);
}
});
}
}```
下半場
其實(shí)也可以通過一個(gè)不太恰當(dāng)?shù)睦觼黻U述什么是MVP兽肤,我們可以把View看作現(xiàn)流行的網(wǎng)紅女主播套腹,在MVC的時(shí)代绪抛,咱們的主播除了展示自己美好的身材以外资铡,還需要不斷的說“喜歡主播的寶寶可以點(diǎn)亮,送的禮物越多主播的浮力越大哦”(此看作邏輯處理)幢码,這樣就會(huì)造成咱們的女主播一邊喊一邊應(yīng)付浮力多辛苦笤休,但是在MVP的時(shí)代,以上邏輯交給了中間人Presenter症副,也就是場館在不斷的發(fā)彈幕處理之前需要主播處理的業(yè)務(wù)邏輯店雅,而咱們的女主播呢政基,就可以專心的表演了僅僅充當(dāng)加載視圖的功能。如果大家不相信闹啦,可以下載個(gè)直播軟件試試哈(我是不是暴露了什么哈哈哈沮明。。窍奋。)荐健,這個(gè)例子不知道準(zhǔn)不準(zhǔn)確,但是以我初學(xué)者的眼神大差不差琳袄。今天的筆記就寫到這里了江场,不知道是否說得明白,大家也在github上下載我的demo來看看窖逗。我的github地址址否。