MVP登錄-----簡單易懂

public abstract class BaseActivity extends Activity  implements LoginView {
    /***是否顯示標題欄*/
    private         boolean isshowtitle = true;
    /***是否顯示標題欄*/
    private         boolean isshowstate = true;
    /***封裝toast對象**/
    private static  Toast   toast;

    protected ProgressDialog progressDialog;

    /***獲取TAG的activity名稱**/
    protected final String  TAG = this.getClass().getSimpleName();
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if(!isshowtitle){
            requestWindowFeature(Window.FEATURE_NO_TITLE);
        }

        if(isshowstate){
            getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN ,
                    WindowManager.LayoutParams. FLAG_FULLSCREEN);
        }
        progressDialog = new ProgressDialog(this);

        //設置佈局
        setContentView(intiLayout());
        //初始化控件
        initView();
        //設置數據
        initData();
    }

    /**
     * 設置佈局
     *
     * @return
     */
    public abstract int intiLayout();

    /**
     * 初始化佈局
     */
    public abstract void initView();

    /**
     * 設置數據
     */
    public abstract void initData();

    /**
     * 是否設置標題欄
     *
     * @return
     */
    public void setTitle(boolean ishow) {
        isshowtitle=ishow;
    }

    /**
     * 設置是否顯示狀態欄
     * @param ishow
     */
    public void setState(boolean ishow) {
        isshowstate=ishow;
    }




    /**
     * 顯示loading對話框
     *
     * @param msg
     */
    @Override
    public void showLoading(String msg) {
        progressDialog.setMessage(msg);
        if (!progressDialog.isShowing()) {
            progressDialog.show();
        }
    }
    /**
     * 隱藏loading對話框
     */
    @Override
    public void hideLoading() {
        if (progressDialog.isShowing()) {
            progressDialog.dismiss();
        }
    }
    /**
     * 顯示錯誤信息
     *
     * @param errorMsg
     */
    @Override
    public void showError(String errorMsg) {
        Toast.makeText(this, errorMsg, Toast.LENGTH_SHORT).show();
    }

    /**
     * 顯示長toast
     * @param msg
     */
    public void toastLong(String msg){
        if (null == toast) {
            toast = new Toast(this);
            toast.setDuration(Toast.LENGTH_LONG);
            toast.setText(msg);
            toast.show();
        } else {
            toast.setText(msg);
            toast.show();
        }
    }

    /**
     * 顯示短toast
     * @param msg
     */
    public void toastShort(String msg){
        if (null == toast) {
            toast = new Toast(this);
            toast.setDuration(Toast.LENGTH_SHORT);
            toast.setText(msg);
            toast.show();
        } else {
            toast.setText(msg);
            toast.show();
        }
    }

}
public class LoginActivity extends BaseActivity implements ILoginView, View.OnClickListener{
    private EditText       edPhone;
    private EditText       edPassword;
    private Button         btnLogin;
    private LoginPresenter presenter;
    @Override
    public int intiLayout() {
        setTitle(false);//設置是否顯示標題欄
        setState(false);//設置是否顯示狀態欄
        return R.layout.activity_main;
    }

    @Override
    public void initView() {
        edPhone = (EditText) findViewById(R.id.ed_phone);
        edPassword = (EditText) findViewById(R.id.ed_password);
        btnLogin = (Button) findViewById(R.id.btn_login);
        btnLogin.setOnClickListener(this);
    }

    @Override
    public void initData() {
        presenter = new LoginPresenter(new UserModel());
        presenter.attachView(this);//這裏與View建立連接

    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn_login:
                presenter.login();
                break;
        }
    }

    @Override
    public String getUsername() {
        return edPhone.getText().toString().trim();

    }

    @Override
    public String getPassword() {
        return edPassword.getText().toString().trim();
    }

    @Override
    public void showResult(String result) {
        Toast.makeText(LoginActivity.this, result, Toast.LENGTH_SHORT).show();
    }

    @Override
    protected void onDestroy() {
        presenter.detachView();//這裏與View斷開連接
        super.onDestroy();
    }
}
public interface ILoginView extends LoginView {
    /**
     * 從UI中獲取用戶輸入的用戶名
     *
     * @return
     */
    String getUsername();

    /**
     * 從UI中獲取用戶輸入的密碼
     *
     * @return
     */
    String getPassword();

    /**
     * 顯示結果
     *
     * @param result
     */
    void showResult(String result);
}

public class LoginPresenter extends BasePresenter<ILoginView> implements ILoginPresenter {

    private IUserModel userModel;

    public LoginPresenter(IUserModel userModel) {
        this.userModel = userModel;
    }

    /**
     * 登錄
     */
    @Override
    public void login() {
        checkViewAttached();
        getMvpView().showLoading("登錄中...");
        userModel.login(getMvpView().getUsername(), getMvpView().getPassword(), new Callback() {
            @Override
            public void onSuccess() {
                if (isViewAttached()) {
                    getMvpView().hideLoading();
                    getMvpView().showResult("登錄成功");
                }
            }

            @Override
            public void onFailure(String errorMsg) {
                if (isViewAttached()) {
                    getMvpView().hideLoading();
                    getMvpView().showResult(errorMsg);
                }
            }
        });
    }
}
public class UserModel implements IUserModel{
    Handler handler = new Handler();

    /**
     * 登錄
     *
     * @param username 用戶名
     * @param password 密碼
     * @param callback 回調
     */

    @Override
    public void login(final String username, final String password, final Callback callback) {
        handler.postDelayed(new Runnable() {//延時200ms回調,模擬網絡請求
            @Override
            public void run() {
                if ("cqlsir".equals(username) && "123456".equals(password)) {
                    callback.onSuccess();
                } else {
                    callback.onFailure("用戶名或密碼錯誤");
                }
            }
        }, 2000);
    }
}
public interface IUserModel {
    /**
     * 登錄
     *
     * @param username 用戶名
     * @param password 密碼
     * @param callback 回調
     */
    void login(String username, String password, Callback callback);
}

public class BasePresenter<V extends LoginView> implements Presenter<V> {
    /**
     * 當前連接的View
     */
    private V mvpView;

    /**
     * Presenter與View建立連接
     *
     * @param mvpView 與此Presenter相對應的View
     */
    @Override
    public void attachView(V mvpView) {
        this.mvpView = mvpView;
    }

    /**
     * Presenter與View連接斷開
     */
    @Override
    public void detachView() {
        this.mvpView = null;
    }

    /**
     * 是否與View建立連接
     *
     * @return
     */
    public boolean isViewAttached() {
        return mvpView != null;
    }

    /**
     * 獲取當前連接的View
     *
     * @return
     */
    public V getMvpView() {
        return mvpView;
    }

    /**
     * 每次調用業務請求的時候都要先調用方法檢查是否與View建立連接,沒有則拋出異常
     */
    public void checkViewAttached() {
        if (!isViewAttached()) {
            throw new MvpViewNotAttachedException();
        }
    }

    public static class MvpViewNotAttachedException extends RuntimeException {
        public MvpViewNotAttachedException() {
            super("請求數據前請先調用 attachView(MvpView) 方法與View建立連接");
        }
    }
}
public interface ILoginView extends LoginView {
    /**
     * 從UI中獲取用戶輸入的用戶名
     *
     * @return
     */
    String getUsername();

    /**
     * 從UI中獲取用戶輸入的密碼
     *
     * @return
     */
    String getPassword();

    /**
     * 顯示結果
     *
     * @param result
     */
    void showResult(String result);
}

public interface LoginView {
    /**
     * 顯示loading對話框
     *
     * @param msg
     */
    void showLoading(String msg);

    /**
     * 隱藏loading對話框
     */
    void hideLoading();

    /**
     * 顯示錯誤信息
     *
     * @param errorMsg
     */
    void showError(String errorMsg);
}
public interface ILoginPresenter {
    /**
     * 登錄
     */
    void login();
}

public interface Callback {
    /**
     * 成功
     */
    void onSuccess();

    /**
     * 失敗
     *
     * @param errorMsg 失敗信息
     */
    void onFailure(String errorMsg);
}
發佈了85 篇原創文章 · 獲贊 25 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章