Android平臺MVP開發模式實戰入門

轉載請表明出處:http://blog.csdn.net/iwanttohitren/article/details/51674687

上一篇文章,我們使用android開源框架LitePal新建了一個android端數據庫userinf.db,本篇我們在已建立的數據庫上寫一個簡單的mvp模式的demo


第一步, 瞭解一下mvp模式

我想從我們瞭解的mvc模式進行比較解說會好一點,mvp模式:M-Model-模型、V-View-視圖、C-Controller-控制器,MVP作爲MVC的進化,那麼MVP所對應的意義:M-Model-模型、V-View-視圖、P-Presenter-表示器。 從MVC和MVP兩者結合來看,Controlller/Presenter在MVC/MVP中都起着邏輯控制處理的角色,起着控制各業務流程的作用。而 MVP與MVC最不同的一點是M與V是不直接關聯的也是就Model與View不存在直接關係,這兩者之間間隔着的是Presenter層,其負責調控 View與Model之間的間接交互。在 Android中很重要的一點就是主線程(MainThread)中才能操作UI,所以對View與Model的切斷分離是 合理的。此外Presenter與View、Model的交互使用接口定義交互操作可以進一步達到松耦合也可以通過接口更加方便地進行單元測試。下面兩張圖比較一下mvc和mvp:
這裏寫圖片描述

第二步,實戰入門(在上篇文章生成的數據庫基礎上)

1,明確一下我們的demo需求,我們小軟件的示意圖如下:
這裏寫圖片描述

在看一下demo的項目結構圖:
這裏寫圖片描述

2,建立bean包,這個包裏面主要是放實體類,對應數據庫中的表。上一篇文章中已經寫了一個實體UserBean,代碼如下:

public class UserBean extends DataSupport{

    @Column(unique = true,nullable = false)
    private int mId;
    @Column(nullable = false)
    private String mName;
    @Column(nullable = false)
    private String mAge;

    //setter和getter
    ...
  }

3,建立model包,這個包裏主要是完成對數據的操作(我這裏展示添刪改查),一般先寫好接口,然後再寫其接口實現,這樣的好處就是便於擴展和單元測試。代碼如下:
接口IUserModel.java

public interface IUserModel {

    //判斷改用戶是否已經存在
    boolean isExist(int id);

    //通過用戶ID獲取用戶信息
    UserBean getUser(int id);

    //通過用戶ID刪除用戶信息
    boolean deleteUser(int id);

    //通過用戶ID修改用戶信息
    boolean updateUser(UserBean userBean);

    //保存用戶信息
    boolean addUser(UserBean userBean);
}

實現類UserModel.java這裏我使用的是開源框架LitePal對數據進行操作,連接上我們上一篇文章中用LitePal新建的數據庫,代碼實現如下:

public class UserModel implements IUserModel {

    @Override
    public boolean isExist(int id) {
        /*
         *UserBean.class相當於定義在那個表中查詢,“mid=?” 和 String.valueOf(id)是
         *查詢的條件,例如 form userbean where mid=2;返回類型爲boolean
         */
        boolean flag = DataSupport.isExist(UserBean.class, "mid=?", String.valueOf(id));

        return flag;
    }

    @Override
    public UserBean getUser(int id) {

        /*
         *這是查詢某條用戶信息,還可以查詢所有的用戶信息,如:
         * List<UserBean> users = DataSupport.findAll(UserBean.class);
         * 或者進行一些複雜的查詢,如:
         * List<UserBean> userBeans = DataSupport.where("mname like ?", 
         * "張%").order("mid").find(UserBean.class);
         */
        UserBean userBean = DataSupport.find(UserBean.class, id);

        return userBean;
    }

    @Override
    public boolean deleteUser(int id) {

        /*
         *返回值是int類型,表示受影響的行數.當然刪除操作也可以像查詢操作一樣,
         * 進行全部刪除或者複雜刪除。
         */
        int delete = DataSupport.delete(UserBean.class, id);
        if(delete > 0)
            return true;
        return false;
    }

    @Override
    public boolean updateUser(UserBean userBean) {

        /*
         *這個是更新某條指定的數據,返回值表示收到影響的行數,也可以更新多條數據,如:
         * userBean.updateAll("mname=?","張三");返回值也是int類型,表示受影響的行數
         */
        int update = userBean.update(userBean.getmId());
        if(update > 0)
            return true;
        return false;
    }

    @Override
    public boolean addUser(UserBean userBean) {

        /*
         *新建一個用戶信息實體類,保存用戶信息
         */
        UserBean user = new UserBean();
        user.setmId(userBean.getmId());
        user.setmName(userBean.getmName());
        user.setmAge(userBean.getmAge());
        boolean flag = user.save();

        return flag;
    }
}

4,建立view包,這裏實現更新UI的顯示內容,新建一個接口IUserView接口,包含操作view的方法,代碼如下:

public interface IUserView {

    //獲得用戶ID文本框的內容
    int getUserId();

    //獲取輸入的用戶信息
    UserBean getUserInf();

    //設置用戶信息
    void setUserInf(UserBean userBean);
}

5,建立presenter包,通過view層接口(IUserView)和model層接口(IUserModel)操作view和model,activity可以把所有的邏輯交給presenter操作,這樣一來邏輯處理就從activity分離出來了。新建UserPresenter.java,代碼如下:

public class UserPresenter {

    private IUserModel mUserModel;
    private IUserView mUserView;

    public UserPresenter(IUserView userView){

        mUserView = userView;
        mUserModel = new UserModel();
    }

    //保存用戶信息
    public void saveUser(Context context){
        if(mUserModel.isExist(mUserView.getUserId())){
            ToastUtil.shortToast(context, "該用戶id已存在");
        }else {
            if(mUserModel.addUser(mUserView.getUserInf())){
                ToastUtil.shortToast(context, "添加成功");
            }else{
                ToastUtil.shortToast(context, "添加失敗");
            }
        }
    }

    //刪除用戶信息
    public void deleteUser(Context context){
        if(!mUserModel.isExist(mUserView.getUserId())){
            ToastUtil.shortToast(context, "該用戶不存在存在");
        }else {
            if(mUserModel.deleteUser(mUserView.getUserId())){
                ToastUtil.shortToast(context, "刪除成功");
            }else{
                ToastUtil.shortToast(context, "刪除失敗");
            }
        }
    }

    //修改用戶信息
    public void updateUser(Context context){
        if(!mUserModel.isExist(mUserView.getUserId())){
            ToastUtil.shortToast(context, "該用戶不存在存在");
        }else {
            if(mUserModel.updateUser(mUserView.getUserInf())){
                ToastUtil.shortToast(context, "修改成功");
            }else{
                ToastUtil.shortToast(context, "修改失敗");
            }
        }
    }

    //查找用戶信息
    public void seacherUser(Context context){
        if(!mUserModel.isExist(mUserView.getUserId())){
            ToastUtil.shortToast(context, "該用戶不存在存在");
        }else {
            UserBean user = mUserModel.getUser(mUserView.getUserId());
            mUserView.setUserInf(user);
        }
    }
}

6,最後的工作在MainActivity中完成,實現IUserView,實例化一個UserPresenter,代碼如下:

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

    UserPresenter presenter;
    EditText etId, etName, etAge;

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

        //生成數據庫
        SQLiteDatabase db = Connector.getDatabase();
        //給按鈕註冊點擊事件
        findViewById(R.id.bt_add).setOnClickListener(this);
        findViewById(R.id.bt_delete).setOnClickListener(this);
        findViewById(R.id.bt_charge).setOnClickListener(this);
        findViewById(R.id.bt_search).setOnClickListener(this);

        etId = (EditText) findViewById(R.id.et_id);
        etName = (EditText) findViewById(R.id.et_name);
        etAge = (EditText) findViewById(R.id.et_age);

        //實例化UserPresenter對象,因爲MainActivity實現了接口IUserView,
        //所以可以傳入this
        presenter = new UserPresenter(this);

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.bt_add:
                presenter.saveUser(this);//這裏傳入this,是爲了顯示toast提示窗口
                break;
            case R.id.bt_delete:
                presenter.deleteUser(this);
                break;
            case R.id.bt_charge:
                presenter.updateUser(this);
                break;
            case R.id.bt_search:
                presenter.seacherUser(this);
                break;
        }
    }

    @Override
    public int getUserId() {
        return Integer.parseInt(etId.getText().toString().trim());
    }

    @Override
    public UserBean getUserInf() {
        UserBean bean = new UserBean();
        bean.setmId(Integer.parseInt(etId.getText().toString().trim()));
        bean.setmName(etName.getText().toString().trim());
        bean.setmAge(etAge.getText().toString().trim());
        return bean;
    }

    @Override
    public void setUserInf(UserBean userBean) {
//        etId.setText(userBean.getmId());
        etName.setText(userBean.getmName());
        etAge.setText(userBean.getmAge());
    }
}

到這裏,demo的所有代碼已經完成,效果我就不展示了,自己寫一寫,耍一耍效果好。我把原碼已經上傳到github了,點擊這裏去下載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章