今天估計是這學期最后一天花這么多時間在Android上了,因為接下來的一段時間里,我將會不斷的考試不斷的做實驗不斷的課程設計,而偏偏我是個學粉。。學渣已經形容不了我了,現在的狀態真的是渣都不剩了。不過還好還好有自己喜歡的事,有事沒事可以看看書看看博客撩撩妹。今天寫一下關于MVP架構的,我盡量將我這個初學者思考過程說清楚。不扯淡先看看今天的demo的預覽圖。
開波
本來我也想先給大家說說什么是MVC然后MVP怎樣來的,然后摔出一大堆官方的文檔,接著說自己的感受。但是這些基本那些介紹MVP的博文都會說到,我就不說了,因為MVC的話,個人覺得你在寫大一點的Demo時自然而然的就會抽取提煉,那大概就是MVC了吧?大差不差。那么什么是MVP呢?下面po圖(第一次畫圖我知道丑不過先將就著吧):
上面的圖其實已經說清楚了什么是MVP
- View層僅負責加載視圖(Activity or Fragment)與用戶交互(鍵盤輸入),不處理業務邏輯。
- Model層負責處理業務。
-
Presenter層負責控制兩者之間的交往?(用這個次準確嗎),因此Presenter必須揣有View和Model的實例。
要點就這三點,下面在代碼中說明吧。
中場
看代碼總是最輕松的,下圖即為demo的java文件。
我先介紹一下各部分的作用:
-
config因為此次順帶復習了一溜
Retorfit
,所以CallService是Retrofit
的接口,Config則是我在聚合數據拿的一個新聞APi。在此謝謝阿里媽媽和馬云爹爹。 - model是業務層,里面有NewInfo這個接收解析后Json數據的實體bean,NewLogic則是業務邏輯處理類,INewCallBack是一個監聽網絡請求后的回調。
- presenter是用以給model和view交互的中間人
- view里面有一個定義給MainActivity使用的接口ViewLogic,通過此接口我們可以給界面添加交互所需的方法。同時因為交互需要來自model的數據,但是并不能直接拿到所以可以拿到Presenter實例間接獲取數據。當然由圖可知通過此接口我們可以在Presenter拿到View的實例。
下面看代碼:
model層
- NewLogic.java
/* 業務邏輯:分析可知功能僅僅為申請新聞數據*/
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**這個類是通過**GsonFormat**解析的太長所以在這里不放了。
**View層**
**ViewLogic.java**
public interface ViewLogic {
//顯示加載bar
void showProgress();
//隱藏加載bar
void hideProgress();
//顯示新聞內容
void showInfo(NewInfo newInfo);
//獲取失敗時操作
void showError(String 獲取新聞信息失敗);
}```
MainActivity.java
public class MainActivity extends AppCompatActivity implements ViewLogic {
//一些聲明
private Button mButton;
private Presenter mPresenter = new Presenter(this);/*獲取Presenter實例間接貨物model數據*/
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();/*獲取新聞數據*/
}
});
}
@Override
public void showProgress() {
mProgress.setVisibility(View.VISIBLE);/*顯示加載條*/
}
@Override
public void hideProgress() {
mProgress.setVisibility(View.GONE);/*隱藏加載條*/
}
/***
* 顯示新聞數據
* @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);
}
/**
* 獲取出錯時
* @param 獲取新聞信息失敗
*/
@Override
public void showError(String 獲取新聞信息失敗) {
Toast.makeText(this, "獲取新聞信息失敗", Toast.LENGTH_SHORT).show();
}
}```
* Activity僅僅用以加載視圖和與用戶交互沒有過多的業務邏輯處理。
**Presenter層**
**Presenter.java**
public class Presenter {
//y必須擁有molde層和view層實例
private NewsLogic mNewsLogic;
private ViewLogic mViewLogic;
public Presenter(ViewLogic viewLogic) {
mViewLogic = viewLogic;
mNewsLogic = new NewsLogic();
}
//功能只有獲取數據
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(獲取新聞信息失敗);
}
});
}
}```
下半場
其實也可以通過一個不太恰當的例子來闡述什么是MVP,我們可以把View看作現流行的網紅女主播,在MVC的時代,咱們的主播除了展示自己美好的身材以外,還需要不斷的說“喜歡主播的寶寶可以點亮,送的禮物越多主播的浮力越大哦”(此看作邏輯處理),這樣就會造成咱們的女主播一邊喊一邊應付浮力多辛苦,但是在MVP的時代,以上邏輯交給了中間人Presenter,也就是場館在不斷的發彈幕處理之前需要主播處理的業務邏輯,而咱們的女主播呢,就可以專心的表演了僅僅充當加載視圖的功能。如果大家不相信,可以下載個直播軟件試試哈(我是不是暴露了什么哈哈哈。。。),這個例子不知道準不準確,但是以我初學者的眼神大差不差。今天的筆記就寫到這里了,不知道是否說得明白,大家也在github上下載我的demo來看看。我的github地址。