iT邦幫忙

2022 iThome 鐵人賽

DAY 26
0
Mobile Development

Android Studio 30天學習系列 第 26

Android Studio 30天學習-DAY26_MVP架構與練習

  • 分享至 

  • xImage
  •  

MVP架構

架構述說

  • MVP架構拆解英文來看會是ModelViewPresenter這三個英文單字,這三個的功能分別是:
    • Model:伺服器、資料庫端,用來回覆Presenter所請求的東西。
    • Presenter:用來將View所請求的東西經過判斷等等的方式確認後再將請求送往Model並收取Model的回覆。
    • View:使用畫面物件送出請求到Presenter並且接收Presenter對Model的請求結果回覆到畫面上給用戶得知結果。
  • 流程圖

===程式碼===

interface接口

這邊要建立一個Interface接口介面,目的是為各個Class轉接。

  • 解析:
    • setString(String string):這個是將收到的資料放入的方法。
    • onButtonClick():是判斷按鈕是否有被點擊,若有被點擊就執行動作。
    • OnNext(Contract.Model.FinishListener OnFinished):是將資料放進OnFinished裡面。
    • OnFinished(String string):收到Model傳入的資料為String型態。
public interface Contract {

    interface View{
        void setString(String string);
    }

    interface Presenter{
        void onButtonClick();
    }

    interface Model{
        interface FinishListener {
            void OnFinished(String string);
        }

        void OnNext(Contract.Model.FinishListener OnFinished);
    }
}

Model

內部程式碼所寫的有一個模擬資料是List<Sring>型態,然後設一個String副程式是接收此List<String>轉成String的資料。

接著OnNext()將定義好的OnFinished叫出並將上面轉好的String資料傳入。

    private static String TAG = "Model";

    List<String> FakeDataList = Arrays.asList(
            "America",
            "China",
            "Japan",
            "Indonesia",
            "Thailand",
            "Taiwan",
            "Korea"
    );

    private String getCountryName(){
        return FakeDataList.toString();
    }

    @Override
    public void OnNext(Contract.Model.FinishListener OnFinished) {
        Log.e(TAG, "OnNext: ");
        OnFinished.OnFinished(getCountryName());
    }

Presenter

  • 解析
    • onButtonClick():這個是判斷View的按鈕有沒有按下,若按下了就會進入model取得資料。
    • OnFinished(String string):這邊會將前面取得的model資料放入View的setString內。
    private Contract.View mainView;
    private Contract.Model model;
    private static String TAG = "Presenter";

    public Presenter(Contract.View mainView, Contract.Model model) {
        this.mainView = mainView;
        this.model = model;
    }

    @Override
    public void OnFinished(String string) {
        if(mainView != null){
            Log.e(TAG, "OnFinished: ");
            mainView.setString(string);
        }
    }

    @Override
    public void onButtonClick() {
        Log.e(TAG, "onButtonClick: ");
        model.OnNext(this);
    }

View

這邊處理畫面的部分,當我按下按鈕之後將訊息傳給Presenter並經過流程獲取到資料後放入setString的欄位中,接著再放入此Class定義的TextView。

    presenter = new Presenter(this,new Model());

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Log.e(TAG, "onClick: ");
            presenter.onButtonClick();
        }
    });

//Interface定義的方法
    @Override
    public void setString(String string) {
        Log.e(TAG, "setString: ");
        showText.setText(string);
    }

結果Logcat圖

  • 這邊可以得到順序:

    • 先按下按鈕log出onClick。
    • 進入Presenter的onButtonClick。
    • 接著進入Model的onNext取得資料。
    • 取完到OnFinished將資料放入setString。
    • 再回到View的setString放入資料到TextView。
  • 畫面顯示圖:

以上是我今天的MVP架構以及實作練習


上一篇
Android Studio 30天學習-DAY25_Glide基礎建立
下一篇
Android Studio 30天學習-DAY27_API_in_MVP基本建立學習
系列文
Android Studio 30天學習30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言