Android MVP框架

今天看了一下MVP接口,大致的流程自己简单的梳理一下:Activity、Fragment实现对应IView接口并重写接口对应的方法(主要是用户让P层来通知我们的activity(V层)刷新页面)。当一个需要修改页面的事件需要发生的时候,Activity或Fragment通过持有的P层对象,去调用Model的执行特定的任务(P层持有Model层的对象以及View层的对象),在P层再去实现Model层的任务执行返回接口接受回调。在P层接受到对于的回调后,根据自己的需求去使用view的去调用刷新Activity或Fragment的布局,讲了这么多,我们直接来代码吧。。。

我希望大家在看这篇文章的时候认真,静下心来去看,自己按照代码打一遍,我相信你会有所收获。

项目目录:

1、大致以model、presenter与view分包


image.png

2、model:按照功能模块划分、分别有loginModel接口与其对于的实现类LoginImp

3、view:按照界面加功能点来分activity、fragment以及功能点loginView接口,activity和fragment分别会去实现不同的iView接口。

LoginModel接口:

package wait.love.com.mvptest.model.login;

/**
 * Created by wanglinbo on 02/01/2019 10:01
 * E-Mail Address:1105059963@qq.com
 */
public interface LoginModel {

    //回调接口
    interface OnLoginListener {
        void onLoginSuccess();

        void onLoginFail();
    }

    void login(String username, String password, OnLoginListener onLoginListener);
}

LoginImp:LoginModel的接口的实现主要用户数据的操作,网络请求,本地读取等

package wait.love.com.mvptest.model.login;

import android.os.Handler;

/**
 * Created by wanglinbo on 02/01/2019 10:04
 * E-Mail Address:1105059963@qq.com
 * M层 主要做网络请求,实现OnLoginLister的回调,以及主要实际网络请求
 */
public class LoginImp implements LoginModel{
    @Override
    public void login(final String username, final String password, final OnLoginListener onLoginListener) {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                if (username.equals("admin") && password.equals("123456")) {
                    onLoginListener.onLoginSuccess();
                } else {
                        onLoginListener.onLoginFail();
                }
            }
        }, 3000);


    }
}

LoginPresenter接口:声明Activity或Fragment(V层)需要操作的方法

package wait.love.com.mvptest.presenter.login;

/**
 * Created by wanglinbo on 02/01/2019 10:19
 * E-Mail Address:1105059963@qq.com
 */
public interface LoginPresenter {
    void doLogin(String name,String password);
}

LoginPresenterImp: LoginPresenterImp是LoginPresenter接口的实现,主要用来做登录这个功能的View与Model层的控制

package wait.love.com.mvptest.presenter.login;

import wait.love.com.mvptest.model.login.LoginModel;
import wait.love.com.mvptest.view.login.LoginView;

/**
 * Created by wanglinbo on 02/01/2019 10:20
 * E-Mail Address:1105059963@qq.com
 */
public class LoginPresenterImp implements LoginPresenter, LoginModel.OnLoginListener {

    private LoginModel loginModel;
    private LoginView loginView;

    public LoginPresenterImp(LoginModel loginModel, LoginView loginView) {
        this.loginModel = loginModel;
        this.loginView = loginView;
    }

    @Override
    public void onLoginSuccess() {
        loginView.hideProgress();
        loginView.loginSuccess();
        loginView.changeData();
    }

    @Override
    public void onLoginFail() {
        loginView.hideProgress();
        loginView.loginFail();
    }

    @Override
    public void doLogin(String name, String password) {
        loginView.showProgress();
        loginModel.login(name,password,this);
    }
}

LoginView:V层接口,

package wait.love.com.mvptest.view.login;

/**
 * Created by wanglinbo on 02/01/2019 09:57
 * E-Mail Address:1105059963@qq.com
 * View层接口
 */
public interface LoginView {
    void showProgress();
    void hideProgress();
    void changeData();
    void loginSuccess();
    void loginFail();
}

MainActivity:LoginView的实现:


public class MainActivityextends AppCompatActivityimplements LoginView {

private Buttonlogin;

    private EditTextusername;

    private EditTextpassword;

    private LoginPresenterImploginPresenterImp =new LoginPresenterImp(new LoginImp(), this);

    @Override

    protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        initView();

    }

private void initView() {

login =this.findViewById(R.id.login);

        username =this.findViewById(R.id.username);

        password =this.findViewById(R.id.password);

        login.setOnClickListener(mClick);

    }

@Override

    public void showProgress() {

Log.i("xyz", "登录中");

    }

@Override

    public void hideProgress() {

Log.i("xyz", "隐藏进度条");

    }

@Override

    public void changeData() {

Toast.makeText(MainActivity.this.getApplicationContext(),"成功",Toast.LENGTH_LONG).show();

        login.setText("登录成功");

    }

@Override

    public void loginSuccess() {

Log.i("xyz", "登录成功");

    }

@Override

    public void loginFail() {

Log.i("xyz", "登录失败");

    }

private View.OnClickListenermClick =new View.OnClickListener() {

@Override

        public void onClick(View view) {

switch (view.getId()) {

case R.id.login:

loginPresenterImp.doLogin(username.getText().toString().trim(), password.getText().toString().trim());

break;

            }

}

};

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容