mvp模式

来源:https://www.cnblogs.com/kkrs/archive/2018/08/20/9492536.html
-Advertisement-
Play Games

MVP 模式將Activity 中的業務邏輯全部分離出來,讓Activity 只做 UI 邏輯的處理,所有跟Android API無關的業務邏輯由 Presenter 層來完成。 Model 層中包含著具體的數據請求,數據源。 Activity 和Fragment 視為View層,負責處理 UI。 ...


MVP 模式將Activity 中的業務邏輯全部分離出來,讓Activity 只做 UI 邏輯的處理,所有跟Android API無關的業務邏輯由 Presenter 層來完成。

Model 層中包含著具體的數據請求,數據源。

Activity 和Fragment 視為View層,負責處理 UI。

Presenter 為業務處理層,既能調用UI邏輯,又能請求數據。

 

首先是Model層,Model層用來獲得數據比如說http請求得到的數據,首先定義model層的介面,在BaseModel里添加了兩個介面。

public interface  BaseModel {
//這裡寫http請求的介面
void login(String username, String password, onFinishedListener listener);

void exit( onFinishedListener listener);
}

在BaseModelImpl來實現介面里的方法,用來獲得數據這裡我模擬了耗時操作來獲取數據並回調介面onFInishListener

public class BaseModelImpl implements BaseModel {
//這裡寫http請求
@Override
public void login(final String username,final String password,final onFinishedListener listener) {
new Handler().postDelayed(new Runnable() {
@Override public void run() {
boolean error = false;
if (TextUtils.isEmpty(username)){
listener.onError("用戶名不存在");//model層裡面回調listener
error = true;
return;
}
if (TextUtils.isEmpty(password)){
listener.onPasswordError();
error = true;
return;
}
if (!error){
// 返回方法名和http請求的結果
listener.onSuccess("login","{}");
}
}
}, 2000);
}
@Override
public void exit(final onFinishedListener listener) {
new Handler().postDelayed(new Runnable() {
@Override public void run() {
// 返回方法名和http請求的結果
listener.onSuccess("exit","{}");
}
}, 2000);
}

介面onFInishListener是獲得數據完成時根據返回結果進行不同的處理

public interface onFinishedListener {
//通用錯誤提示
void onError(String error);

//需要特殊處理的錯誤提示
void onUsernameError();

void onPasswordError();
/**
*
* @param way 方法名
* @param result 返回結果
*/
void onSuccess(String way,String result);
}

BaseView是改變UI層的介面,在Activity或者Fragment調用改變UI,BaseView的實現在activity或者fragment實現

 

public interface BaseView {

void showProgress();

void hideProgress();

void setUsernameError();

void setPasswordError();

void setError(String error);

void success(String way, String result);

}

BasePresentesenter的作用連接Model 層和View 

public interface BasePresenter {

void login(String username, String password);

void exit();

void onDestroy();
}

下麵是實現 BasePresentesenter的方法

public class BasePresenterImpl implements BasePresenter, onFinishedListener {
private BaseView baseView;
private BaseModel baseModel;


public BasePresenterImpl(BaseView baseView){
this.baseView = baseView;
this.baseModel = new BaseModelImpl();
}

@Override
public void login(String username, String password) {
if (baseView != null) {
baseView.showProgress();
}
baseModel.login(username, password, this);
}

@Override
public void exit() {
if (baseView != null) {
baseView.showProgress();
}
baseModel.exit(this);
}

@Override
public void onDestroy() {
baseView = null;
}

@Override
public void onError(String error) {
if (baseView != null) {
baseView.setError(error);
baseView.hideProgress();
}
}

@Override
public void onUsernameError() {
if (baseView != null) {
baseView.setUsernameError();
baseView.hideProgress();
}
}

@Override
public void onPasswordError() {
if (baseView != null) {
baseView.setPasswordError();
baseView.hideProgress();
}
}

@Override
public void onSuccess(String way, String result) {
if (baseView != null) {
baseView.success(way,result);
baseView.hideProgress();
}
}
}

UI層實現BaseView的介面下麵是實例

public class MainActivity extends AppCompatActivity implements BaseView,View.OnClickListener {


private ProgressBar progress;
private BasePresenter presenter;
private Button button;
private EditText username;
private EditText password;
private Button exit;

private CustomDialog progressDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

progressDialog = new CustomDialog(this, R.style.CustomDialog);
progress = (ProgressBar)findViewById(R.id.progress);
presenter = new BasePresenterImpl(this);
username = (EditText) findViewById(R.id.username);
password = (EditText) findViewById(R.id.password);
button = (Button)findViewById(R.id.button);
button.setOnClickListener(this);
exit = (Button)findViewById(R.id.exit);
exit.setOnClickListener(this);
}


@Override
public void showProgress() {
progressDialog.show();
}

@Override
public void hideProgress() {
progressDialog.cancel();
}

@Override
public void setUsernameError() {
username.setError(getString(R.string.username_error));
}

@Override
public void setPasswordError() {
password.setError(getString(R.string.password_error));
}

@Override
public void setError(String error) {
Toast.makeText(this,error,Toast.LENGTH_SHORT).show();
}

@Override
public void success(String way, String result) {
Toast.makeText(this,way,Toast.LENGTH_SHORT).show();
//根據調用的介面,更新成功的ui
}

@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.button:
presenter.login(username.getText().toString(), password.getText().toString());
break;
case R.id.exit:
presenter.exit();
break;
}
}

@Override
protected void onDestroy() {
presenter.onDestroy();
super.onDestroy();
}
}

 

在baseView定義不同的錯誤,在Activity中處理他們來改變ui,比如說用戶名錯誤我們就調用setUsernameError的方法來提示用戶用戶名錯誤,如果調用成功時會回調success方法,第一個參數是調用方法的名稱,用來區分各個介面調用成功之後的不同處理,第二個參數result是返回的數據,用來處理或者填充列表。

 

github的網址:https://github.com/tempest1/androidMvp






您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 上周,以前公司的同事朋友找我幫忙,看看能否幫忙恢復一個MySQL 資料庫,具體情況為:資料庫版本為MySQL 5.6(具體版本不清楚),也不清楚具體的資料庫引擎; 沒有資料庫備份,只剩下資料庫下麵的一些文件(frm、idb),具體原因是因為出現問題的時候,重裝了MySQL,最要命的是ibdata1等... ...
  • 主要是常用的hbase shell命令,包括表的創建與刪除,表數據的增刪查【hbase沒有修改】;以及hbase的導出與導入。 參考教程:HBase教程 參考博客:hbase shell基礎和常用命令詳解 參考博客:hbase shell常用命令和filter 參考博客:hbase導入導出數據 1. ...
  • 恢復內容開始 1、MySQL概述 1.什麼是資料庫? 存儲數據的倉庫 2.都有哪些公司在用資料庫? 金融機構、游戲公司、購物網站、論壇網站... 3.提供資料庫服務的軟體? 1.軟體分類 MySQL、Oracle、SQL_Server、DB2、MongoDB、MariaDB 2.生產環境中,如何選擇 ...
  • MongoDB:NoSQL資料庫 MongoDB中的重要指示點 MongoDB中的三要素 資料庫 集合 文檔 MongoDB中的數據存儲是以Bson的形式存儲的,Bson是二進位的json,所以看上去記錄的形式類似於json數據 MongoDB中集合中的數據不同於關係型資料庫中的數據,MongoDB ...
  • 1.事務 在sql servce 中 事務是一個工作單元 可能包含查詢和修改數據以及修改數據定義等多個活動 也可以顯示或隱式定義事務邊界 顯示定義事務 BEGIN TRAN 開始 如果要提交事務 使用 COMMIT TRAN 撤銷事務(回滾) ROLLBACK TRAN 如下示例 一個簡單的顯示事務 ...
  • Redis簡介 Redis是一個開源的使用ANSI C語言編寫、支持網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。 Redis是 NoSQL技術陣營中的一員,它通過多種鍵值數據類型來適應不同場景下的存儲需求,藉助一些高層級的介面使用其可以勝任,如緩存、隊列系統 ...
  • 1、主從複製簡而言之為將主redis的數據同步到從redis,達到主從數據一致。主從複製應用: 讀寫分離 容災備份 2、怎樣設置主從? 原則:配從不配主 方式: a、在從redis中使用執行命令 slaveof host port [slaveof no one命令表示禁止和主機的同步] b、在從r ...
  • 連接查詢又稱多表查詢,查詢到的欄位來自於多個表中的數據。 一、 連接查詢的分類和語法 1.分類 按標準分: 92標準:只支持內連接 99標準:支持內連接和、外連接和全外連接 功能進行分類: 內連接:inner 等值連接 非等值連接 自連接 外連接: 左外連接left 【outer】 右外連接righ ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...