美文网首页
Android MVP Demo

Android MVP Demo

作者: 无敌未央様 | 来源:发表于2019-08-06 15:13 被阅读0次

MVP作为Android最常用的框架,网上已经有很多相关的解释,每个人对MVP的实现方式都有些许不同,但总的思想还是一样的,这方面的理论知识网上已经有很多人写过了,我这里就不拾人牙慧了,我自己基于自己对MVP的理解,写了一个关于登录的简单demo


相关的分包

布局

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
    xmlns:app="http://schemas.android.com/apk/res-auto">
 

    <EditText
        android:id="@+id/edit_account"
        android:layout_width="250dp"
        android:layout_height="50dp"
        android:maxLines="1"
        android:hint="account"
        android:layout_marginTop="30dp"
        android:layout_centerHorizontal="true"/>


    <EditText
        android:id="@+id/edit_password"
        android:layout_width="250dp"
        android:layout_height="50dp"
        android:layout_below="@id/edit_account"
        android:maxLines="1"
        android:hint="password"
        android:inputType="textPassword"
        android:layout_centerHorizontal="true" />



    <Button
        android:id="@+id/btn_login"
        android:layout_below="@id/edit_password"
        android:layout_width="200dp"
        android:text="login"
        android:textAllCaps="false"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="30dp"
        android:layout_height="40dp" />

    <ProgressBar
        android:id="@+id/progressBar"
        android:visibility="gone"
        style="?android:attr/progressBarStyle"
        android:layout_centerInParent="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</RelativeLayout>

Model层

BaseModel

public interface BaseModel {
    void onCompleted();    //结束
    void onFailure();      //失败
    void onSuccess();      //成功
}

ILoginModel

public interface ILoginModel extends BaseModel {
//这里可以写登录自己特有接口,我偷懒就不写了
    void onSuccess();
    void onFailure();
}

LoginModel

public class LoginModel {
    public static void judge(final String account, final String password, 
final ILoginModel callback) {
//模拟一下网络延迟
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
//这里随便写了一个判断,正常是要去做网络请求的
                if(account.equals("admin")&&password.equals("123456")){
                    callback.onSuccess();
                }else {
                    callback.onFailure();
                }
                callback.onCompleted();
            }
        },1000);
    }
}

Presenter层

MVP的一个缺点我觉得就是Presenter层可能会非常庞大

BasePresenter

public abstract class BasePresenter<T extends BaseView>  {
    protected T mView;
    public void attachView(T view) {
        mView = view;
    }
    public void detachView() {
        mView = null;
    }
    protected boolean isViewAttached() {
        return mView != null;
    }
    public T getView() {
        return mView;
    }
}

LoginPresenter

public class LoginPresenter extends BasePresenter<ILoginView> {
    public void Judge(String account, String password) {
        if (!isViewAttached()){
            return;
        }
        mView = getView();
        mView.showWaiting();
        LoginModel.judge(account, password, new ILoginModel() {
            @Override
            public void onSuccess() {
                if (isViewAttached()) {
                    mView.successMessage();
                }
            }
            @Override
            public void onFailure() {
                if (isViewAttached()) {
                    mView.failureMessage();
                }
            }
            @Override
            public void onCompleted() {
                if (isViewAttached()){
                    mView.dismissWaiting();
                }
            }
        });
    }
}

View层

BaseView

public interface BaseView {
    void showWaiting();         //开启等待框
    void dismissWaiting();      //关闭等待框
}

ILoginView

public interface ILoginView extends BaseView {
    void successMessage();    //登录成功
    void failureMessage();    //登录失败
}

BaseActivity

public abstract class BaseActivity extends AppCompatActivity {
    //相关业务代码
}

MVPActivity

public abstract class MVPActivity<V extends BaseView, T extends BasePresenter<V>>
 extends BaseActivity implements BaseView{
    protected T mPresenter;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mPresenter=createPresenter();
        mPresenter.attachView((V)this);
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        mPresenter.detachView();
    }
    protected abstract T createPresenter();
}

LoginActivity

public final class LoginActivity extends MVPActivity<ILoginView, LoginPresenter>
 implements ILoginView, View.OnClickListener {
    private EditText accountEdit;
    private EditText passwordEdit;
    private Button loginBtn;
    private ProgressBar progressBar;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }
    private void initView(){
        accountEdit = findViewById(R.id.edit_account);
        passwordEdit = findViewById(R.id.edit_password);
        loginBtn = findViewById(R.id.btn_login);
        progressBar = findViewById(R.id.progressBar);
        loginBtn.setOnClickListener(this);
    }
    void login(String account, String password){
        mPresenter.Judge(account, password);
    }
    @Override
    protected LoginPresenter createPresenter() {
        return new LoginPresenter();
    }
    @Override
    public void showWaiting() {
        progressBar.setVisibility(View.VISIBLE);
    }
    @Override
    public void dismissWaiting() {
        progressBar.setVisibility(View.GONE);
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn_login:
                login(accountEdit.getText().toString(),passwordEdit.getText().toString());
                break;
            default:
                break;
        }
    }
    @Override
    public void successMessage() {
        Toast.makeText(this,"success",Toast.LENGTH_SHORT).show();
    }
    @Override
    public void failureMessage() {
        Toast.makeText(this,"failure",Toast.LENGTH_SHORT).show();
    }
}

相关文章

  • Google MVP Demo深入学习和总结

    Google在2016年推出了官方的Android MVP架构Demo,本文主要分析一下官方的MVP Demo,并...

  • Android MVP Demo

    MVP作为Android最常用的框架,网上已经有很多相关的解释,每个人对MVP的实现方式都有些许不同,但总的思想还...

  • Android Mvp实践

    Android Mvp实践 简介 本文是参考google官方发布的MVP架构demo以及前人对MVP实现方式的一些...

  • Android学习MVP架构的最简单方法

    Android MVP Demo 最近总是听说到MVP,自己便开始研究起来,看了两三篇博客,大明其意。 学习MVP...

  • Android MVP模式

    介绍Android MVP模式的文章,Demo的实现很详细,易懂。文章:Android中的MVPDemo:Rock...

  • Google官方Android MVP架构Demo之单元测试

    Google官方Android MVP架构Demo之单元测试 Google在2016年推出了官方的Android ...

  • Android MVP

    Android MVP初探 Android MVP进阶 Android MVP高级 Android MVP扩展

  • Android-MVP Demo

    说在前面 引用Rocko说过的一段话 MVP作为一种MVC的演化版本在Android开发中受到了越来越多的关注,但...

  • MVP / RxJava / Retrofit / RxBus

    MVP Android MVP 详解(上) Android MVP 详解(下) Android中的MVP模式,带实...

  • Android项目框架搭建:mvp+retrofit+rxjav

    这段时间公司需要将原项目重构成mvp架构,本人参考了网上一些关于Android的mvp项目说明和demo,再加上自...

网友评论

      本文标题:Android MVP Demo

      本文链接:https://www.haomeiwen.com/subject/mvnidctx.html