您好,登錄后才能下訂單哦!
MVP架構略解:
M--Model,業務層(主要負責具體功能實現)
V--View,視圖層(用作顯示)
P--Presenter,連接層(搭建Model層和View層通信橋梁)
MVP模式下,Model層和View層是完全隔離(解偶)的,兩者的通信都是通過Presenter層作為橋梁來進行通信的,所以,Presenter層中一定含有Model層和View層具體實例(由這可以看出,當界面改變時,只需更改Presenter層中的View實例即可;同理,當數據加載方式改變時,只需更改Presenter層中的Model實例即可.
心得:
要寫出MVP架構代碼,主要是看M層和V層功能概述:
1.首先看View層,View層主要做顯示用,那么,寫View層接口的時候,就要考慮下View層有多少種顯示需求,從而定義出相應接口.
2.看完View層后,就要考慮下Model層具體業務功能的實現了,實現過程中,有可能處于耗時狀態,此時的狀態就應該通過某個接口通知到Presenter層,從而讓View層也得知,做出相應顯示;實現結果成功失敗也是如此(也就是說,Model層操作結果要通過Presenter的接口讓Presenter知道,從而讓View層知道).
eg:界面只有一個TextView用作顯示,想假設從網絡上下載文件(模擬為加載數據),TextView在下載不同過程進行不同的文字提示.
思路:
1.View層:主要分3個過程:下載時提示,下載成功提示,下載失敗提示.
//com.mvp.view
public interface IView
{
void onLoading();
void onSuccess(List<String> data);//數據下載成功后,進行顯示
void onFailed();
}
2. Model層:主要進行數據加載
//com.mvp.model
public interface IModel
{
//加載數據可能是異步操作,通過接口回調告知Presenter結果
void loadData(IPresenter listener);
}
//com.mvp.presenter
public interface IPresenter
{
void loadData();//告訴Model開始loadData
void onSuccess(List<String> data);
void onFailed();
void onDestroy();
}
以上,就將通用的MVP接口定義出來的,后續要做的就是針對特定層做出特定實現即可.
//com.mvp.model
public class IModelImpl01 implements IModel
{
@Override
void loadData(IPresenter listener)
{
//do download func,here pausing 10s to imitate the download behav
try{
Thread.sleep(10000);
List<String> data = new ArrayList<String>();
data.add("imitate loading data successfully");
listener.onSuccess(data);
}catch(Exception e)
{
listener.onFailed();
}
}
}
//com.mvp.presenter
public class IPresenterImpl01 implements IPresenter
{
private IView view;
private IModel model;
public IPresenterImpl01(IView view)
{
this.view = view;
model = new IModelImpl01();
}
@Override
void loadData()
{
if(view != null)
{
view.onLoading();
}
model.loadData(this);
}
@Override
void onSuccess(List<String> data)
{
if(view != null)
{
view.onSuccess(data)
}
}
@Override
void onFailed()
{
if(view != null)
{
view.onFailed();
}
}
@Override
void onDestroy()
{
view = null;
}
}
//com.mvp.view
public class MainActivity extends Activity implements IView
{
private TextView tvShow;
private IPresenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvShow = (TextView)findViewById(R.id.tvShow);
presenter = new IPresenterImpl01(this);
presenter.loadData();
}
@Override
void onLoading()
{
tvShow.setText("onLoading...");
}
@Override
void onSuccess(List<String> data)//數據下載成功后,進行顯示
{
tvShow.setText("load data success:"+data);
}
@Override
void onFailed()
{
tvShow.setText("load data failed");
}
@Override
protected void onDestroy()
{
super.onDestroy();
presenter.onDestroy();
}
}
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。