最近在阅读郭霖大神的公众号时,分类中架构引起了我的注意。
虽然是个人开发(水平很菜的那种),但最终都要向企业正式项目开发靠近。因此接下来一段时间,主要学习一下MVP架构、Retrofit以及RxJava
本篇文章来自study_zhxu,博客地址:http://blog.csdn.net/study_zhxu
本篇文章未完成,仅做学习记录
MVP把Activity中的UI逻辑抽象成View接口,把业务逻辑抽象成Presenter接口,Model类还是原来的Model。
在MVP模式中,Activity的功能就是响应生命周期和显示界面,具体其他工作都丢到了Presenter层中进行完成,Presenter其实是Model层和View层的桥梁。
创建MVP步骤:
1.创建IPresenter接口,把所有业务逻辑的接口都放在这里,并创建它的实现PresenterCompl(在这里可以方便查看业务逻辑功能,由于接口可以有多种实现所以也方便写单元测试)
2.创建IView接口,把所有视图逻辑的接口都放在这里,其实现类是当前的Activity/Fragment
3.Aactivity中只包含了一个IPresenter,而PresenterCompl里又包含了一个IView并且依赖了Model。Activity里只保留了IPresenter的调用,其他工作全部留到PresenterCompl中实现。
4.Model并不是必须有的,但是一定会有View和Presenter。
直接上例子:
1.创建Presenter接口
ILoginPresenter
package com.paul.learningmvp.presenter; public interface ILoginPresenter { //清除输入框 public void clear(); //登录操作 public void doLogin(String name,String password); }
实现ILoginPresenteeer
LoginPresenterCompl
package com.paul.learningmvp.presenter; import com.paul.learningmvp.model.User; import com.paul.learningmvp.view.ILoginView; public class LoginPresenterCompl implements ILoginPresenter { private ILoginView loginView; private User user; public LoginPresenterCompl(ILoginView loginView) { this.loginView = loginView; user=new User("110","123456"); } @Override public void clear() { loginView.onClearText(); } @Override public void doLogin(String name, String password) { boolean result=false; int code=0; if(name.equals(user.getName())&&password.equals(user.getPassword())){ result=true; code=1; }else { result=false; code=0; } loginView.onLoginResult(result,code); } }
2.创建IView接口,所有对View的操作写在这里,和Presenter相关
ILoginView
package com.paul.learningmvp.view; public interface ILoginView { public void onClearText(); public void onLoginResult(Boolean result,int code); }
Activit是IView接口的实现类
LoginActivity
package com.paul.learningmvp.view; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import com.paul.learningmvp.R; import com.paul.learningmvp.presenter.ILoginPresenter; import com.paul.learningmvp.presenter.LoginPresenterCompl; import com.paul.learningmvp.view.ILoginView; public class LoginActivity extends AppCompatActivity implements ILoginView, View.OnClickListener { private Button mLogin; private Button mClear; private EditText mName; private EditText mPassword; ILoginPresenter loginPresenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mLogin=findViewById(R.id.btn_confirm); mClear=findViewById(R.id.btn_clear); mName=findViewById(R.id.tv_name); mPassword=findViewById(R.id.tv_password); mLogin.setOnClickListener(this); mClear.setOnClickListener(this); loginPresenter=new LoginPresenterCompl(this); } @Override public void onClearText() { mName.setText(""); mPassword.setText(""); Toast.makeText(this,"clear",Toast.LENGTH_SHORT).show(); } @Override public void onLoginResult(Boolean result, int code) { mLogin.setEnabled(true); mClear.setEnabled(true); if(result){ Toast.makeText(this,"登录成功",Toast.LENGTH_SHORT).show(); }else { Toast.makeText(this,"登录失败",Toast.LENGTH_SHORT).show(); } } @Override public void onClick(View v) { String name=mName.getText().toString(); String password=mPassword.getText().toString(); switch (v.getId()){ case R.id.btn_confirm: loginPresenter.doLogin(name,password); break; case R.id.btn_clear: loginPresenter.clear(); break; } } }
3.model
User
package com.paul.learningmvp.model; public class User { private String name; private String password; public User(String name, String password) { this.name = name; this.password = password; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }