91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

android MVP模式簡介

發布時間:2020-04-04 20:17:26 來源:網絡 閱讀:1089 作者:whatever957 欄目:移動開發



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();

}

}





向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

增城市| 肃宁县| 武邑县| 仪陇县| 二连浩特市| 河曲县| 华宁县| 公安县| 乌兰浩特市| 城固县| 诸暨市| 盐亭县| 崇左市| 密云县| 河南省| 长白| 休宁县| 徐闻县| 云南省| 桐庐县| 武冈市| 大竹县| 梁平县| 天等县| 金昌市| 承德市| 芷江| 卓尼县| 布尔津县| 新竹县| 武宁县| 禹州市| 松原市| 徐州市| 喀什市| 始兴县| 建阳市| 巴东县| 科尔| 绥宁县| 资中县|