簡化的mvp架構:FinalMvp

jopen 9年前發布 | 10K 次閱讀 FinalMvp Android開發 移動開發

FinalMvp

mvp模式介紹

   由圖可見,mvp模式將分為View、presenter、model,而presenter將連接View和model,
  view和model之間不允許直接交互.
  將view和model完全隔絕,可以說完全解決了耦合性的問題。
  道理很容易理解,可是要想真正做好卻不那么容易!

finaMvp介紹

  finalMvp是為了輕松使用mvp模式開發,并且規范mvp代碼而編寫的框架。
  該框架的結構為:BaseView BasePresenter BaseModel
  代碼中直接繼承這三類,變可以輕松實現mvp分層
  finalMvp架構模型圖:  

代碼實現

 1、activity繼承BaseView
    onDataChanage()//當數據變化時通知此方法
    onChanageUi()//presenter可以直接發送修改ui指令,在onChangeUi接收
    編輯數據字段加上注解@ViewData,presenter會使用依賴注入修改數據
 2、編輯presenter繼承BasePresenter
    initModel()//初始化model
    onModelCallBack//數據返回后的監聽
    執行loadData()//請求數據,會發送到model的loadData
    執行setDataChanage(data)//將view中標注@ViewData的數據值修改為data,并通知view改變ui
 3、編輯model繼承BaseModel
    loadData(tag,msg)//加載數據
    chanageData(tag,data)//數據加載完成后調用這個方法

demo代碼

Activity編輯實現BaseView

public class MainActivity extends Activity implements BaseView{
    private MainPresenter preseneter;
    private TextView tv;
    /**
     * ViewData便是數據源注解,通過此注解可以自動修改值
     */
    @ViewData
    public String data="aaaaaaaaaaaaaaaaaaaaaaa";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        preseneter=new MainPresenter(this);
        tv=new TextView(this);
        setContentView(tv);
        tv.setText(data);
        tv.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                preseneter.chanageTextView();
            }
        });
    }
    @Override
    public void onDataChanage() {
        tv.setText(data);
    }
    @Override
    public void onChanageUi(int tag) {
    }
}

MainPresenter繼承BasePresenter

public class MainPresenter extends BasePresenter{
    private final int TAG_LOAD_DATA=1;
    public MainPresenter(BaseView view) {
        super(view);
    }
    public void chanageTextView(){
        loadData(TAG_LOAD_DATA, "http://xxxxx");
    }
    /**
     * 初始化model
     */
    @Override
    public BaseModel initModel() {
        return new MainModel();
    }
    @Override
    public void onModelCallBack(int tag, Object obj) {
        switch (tag) {
        case TAG_LOAD_DATA:
            /**
             * 執行setDataChange,代碼便會將BaseView中的注解的值替換為obj,
             * 并執行BaseView下的onDataChanage方法,通知BaseView修改ui
             */
            setDataChanage(obj);
            break;
        }
    }
}

MainModel繼承BaseModel

public class MainModel extends BaseModel{
    @Override
    public void loadData(final int tag, String msg) {
        new Thread(){
            public void run() {
                //執行耗時操作,如執行http請求,從sqlite中讀取或計算數據
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //返回得到計算后的數據,將數據返回
                chanageData(tag, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
            };
        }.start();
    }
}

項目主頁:http://www.baiduhome.net/lib/view/home/1447305964725

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!