Android設計模式——MVP

1、什麼是MVPandroid

MVP:全稱 Model-View-Presenter。網絡

MVP框架由3部分組成:View層負責顯示,Presenter層負責邏輯處理,Model層提供數據。框架

View:負責繪製UI元素、與用戶進行交互(在Android中體現爲Activity,Fragment)ide

Model:負責存儲、檢索、操縱數據oop

Presenter:做爲View與Model交互的中間紐帶,處理與用戶交互的負責邏輯。
image.png佈局

2、建立Model Presenter View三個包post

image.png

3、代碼編寫this

1.View層代碼code

view層負責界面操做,如何肯定view層裏面有那些操做呢?
拿我這個UserView舉例.
onLogin表明登陸時候要作的事情,好比顯示一個進度dialog
loginSuccess表明登陸成功後要作的事情,作界面跳轉等操做
loginFail表示登陸失敗後得操做,顯示一個Toast等xml

public interface  UserView{
    void onLogin();
    void loginSuccess(UserBean bean);
    void loginFail(Exception e,int code);
}

2.Presenter層代碼

這層主要負責View層和Model層的鏈接,也有中間人得意思,
View層請求Presenter層,Presenter在請求Model層,Model層處理數據以後經過回調接口傳遞給Presenter層,Presenter在傳遞給View層

在上一張圖
image.png

public class UserPresenter implements UserCallback {
    private UserView  mUserView;
    private UserModel mModel;

    public UserPresenter(UserView baseView) {
        mUserView = baseView;
        mModel= new UserModel(this);
    }

    public void userLogin(String name, String pass){
        mUserView.onLogin();
        mModel.userLogin(name,pass);
    }

    @Override
    public void onSuccess(UserBean bean) {
        mUserView.loginSuccess(bean);
    }

    @Override
    public void onFail(Exception e, int code) {
        mUserView.loginFail(e,code);

    }
}
public  interface  UserCallback {
    void onSuccess(UserBean bean);
    void onFail(Exception e ,int code);
}

3.model層代碼

model層進行網絡請求等耗時任務處理,model會留有一個回調地址,當數據處理完成以後回調它,在本實例中UserCallback就是一個回調接口,具體實現類在Presenter層,也就是說數據處理完成以後會傳遞給Presenter層

public class UserModel {
    private UserCallback mUserCallback;
    private Map<String,String> mUserMaps;
    private Handler mHandler;

    /**
     * 
     * @param userCallback 回調地址,當數據處理完成以後調用這個接口
     */
    public UserModel(UserCallback userCallback) {
        mUserCallback = userCallback;
        mUserMaps=new HashMap<>();
        mHandler =new Handler(Looper.getMainLooper());
        mUserMaps.put("user1","123456");
        mUserMaps.put("user2","12345");
        mUserMaps.put("user3","1234");

    }

    public void userLogin(final  String name, final String pass){
        /**
         * 模擬延時操做,2秒後調用UserCallback接口,回傳數據
         */
       mHandler.postDelayed(new Runnable() {
           @Override
           public void run() {
               if (mUserMaps.containsKey(name) && mUserMaps.get(name).equals(pass)){
                   UserBean bean =new UserBean(name,pass,20);
                   mUserCallback.onSuccess(bean);
               }else {
                   Exception exception =new Exception("用戶名或帳號錯誤");
                   mUserCallback.onFail(exception,400);
               }
           }
       },2000);
    }

}

4.MainActivity

public class MainActivity extends AppCompatActivity implements UserView ,View.OnClickListener {
    private  ProgressDialog mProgressDialog;
    private EditText mUserText;
    private EditText mUserPass;
    private Button mLoginBtn;
    private UserPresenter mUserPresenter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mUserPresenter=new UserPresenter(this);
        initView();
        initEvents();
    }

    private void initEvents() {
        mLoginBtn.setOnClickListener(this);
    }

    public void initView () {
        mUserText = (EditText) findViewById(R.id.userName);
        mUserPass = (EditText) findViewById(R.id.userPass);
        mLoginBtn = (Button) findViewById(R.id.loginBtn);
    }

    @Override
    public void onLogin() {
        mProgressDialog =new ProgressDialog(this);
        mProgressDialog.show();
    }

    @Override
    public void loginSuccess(UserBean bean) {
        Toast.makeText(this, "登陸成功,年齡"+bean.getAge(), Toast.LENGTH_SHORT).show();
    }

    @Override
    public void loginFail(Exception e, int code) {
        if (mProgressDialog!=null){
            mProgressDialog.dismiss();
            Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.loginBtn:
                if (getUserPass().length()==0 || getUserText().length()==0){
                    Toast.makeText(this, "請輸入帳號或密碼", Toast.LENGTH_SHORT).show();
                    return;
                }
                mUserPresenter.userLogin(getUserText(),getUserPass());
                break;
        }
    }
    private String getUserText(){
        return mUserText.getText().toString();
    }
    private String getUserPass(){
        return  mUserPass.getText().toString();
    }
}

5.XML佈局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    android:background="#ffffff"
    tools:context=".MainActivity">
    <LinearLayout
        android:layout_margin="15dp"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <EditText
            android:paddingLeft="6dp"
            android:paddingRight="6dp"
            android:textColor="#616161"
            android:id="@+id/userName"
            android:inputType="text"
            android:background="@drawable/shape_editview"
            android:layout_width="match_parent"
            android:layout_height="55dp" />
        <EditText
            android:paddingLeft="6dp"
            android:paddingRight="6dp"
            android:textColor="#616161"
            android:layout_marginTop="8dp"
            android:id="@+id/userPass"
            android:inputType="textPassword"
            android:background="@drawable/shape_editview"
            android:layout_width="match_parent"
            android:layout_height="55dp" />
        <Button

            android:layout_marginTop="8dp"
            android:textColor="#ffffff"
            android:textSize="19sp"
            android:background="@drawable/shape_login_btn"
            android:text="登陸"
            android:id="@+id/loginBtn"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>
</LinearLayout>

image.png

6.兩個shape
shape_editview.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="30dp"></corners>
    <solid android:color="#f7f5f5"></solid>
</shape>

shape_login_btn.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <shape>
            <corners android:radius="100dp"></corners>
            <solid android:color="#03a9f4"></solid>
        </shape>
    </item>
    <item android:state_pressed="false">
        <shape>
            <corners android:radius="100dp"></corners>
            <solid android:color="#0a9ddf"></solid>
        </shape>
    </item>
</selector>

以上就是MVP模式得簡單實現.必定要多加練習,才能體會掉MVP得優勢

相關文章
相關標籤/搜索