一、为什么用?
优点:
1、代码逻辑简洁
2、降低耦合、方便维护
缺点:
代码可能会比MVC多,层次更复杂一些,但是省去了在大篇幅中找代码的烦恼
二、怎么用
1、先看目录
2、实现base类
BaseModel和BaseView我这里没有公用的,所以是空的类,BaseView是个接口类
BasePresenter类
public abstract class BasePresenter<V extends BaseView> {
private V mView;
public V getView() {
return mView;
}
/**
* 绑定view
*
* @param v
*/
public void attachView(V v) {
mView = v;
}
/**
* 解绑view
*/
public void detachView() {
mView = null;
}
}
BaseActivity
public abstract class BaseActivity<V extends BaseView, P extends BasePresenter<V>>
extends AppCompatActivity {
private P mPresenter;
private V mView;
public P getmPresenter() {
return mPresenter;
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getLayoutId());
if (mPresenter == null) {
mPresenter = createPresenter();
}
if (mView == null) {
mView = createView();
}
if (mPresenter != null && mView != null) {
mPresenter.attachView(mView);
}
init();
}
public abstract int getLayoutId();
public abstract P createPresenter();
public abstract V createView();
public abstract void init();
@Override
protected void onDestroy() {
super.onDestroy();
if (mPresenter != null) {
mPresenter.detachView();
}
}
}
BaseFragment
public abstract class BaseFragment<V extends BaseView, P extends BasePresenter<V>> extends Fragment {
private P presenter;
private V view;
private Context mContext;
public P getPresenter() {
return presenter;
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(getlayoutId(), container, false);
mContext = getActivity();
if (presenter == null) {
presenter = createPresenter();
}
if (this.view == null) {
this.view = createView();
}
if (presenter != null && view != null) {
presenter.attachView(this.view);
}
init();
return view;
}
protected abstract int getlayoutId();
protected abstract void init();
protected abstract V createView();
protected abstract P createPresenter();
@Override
public void onDestroyView() {
super.onDestroyView();
if (presenter != null) {
presenter.detachView();
}
}
}
3、使用以MainActivity为例
先创建节点类 MainContact
public interface MainContact {
interface View extends BaseView {
void showMessage(String msg);
}
abstract class Presenter extends BasePresenter<View> {
public abstract void getMessage(String id, String name);
}
abstract class Model extends BaseModel {
public abstract void login(String name, String id, LoginInterface loginInterface);
}
}
创建 MainModel类
public class MainModel extends MainContact.Model {
@Override
public void login(String name, String id, LoginInterface loginInterface) {
//持久化操作,或者请求网络
if (name.equals("123") && id.equals("123")) {
loginInterface.loginResult("成功");
} else {
loginInterface.loginResult("失败");
}
}
}
创建 MainPresenter类
public class MainPresenter extends MainContact.Presenter {
private MainModel mainModel;
public MainPresenter() {
mainModel = new MainModel();
}
@Override
public void getMessage(String id, String name) {
mainModel.login(name, id, new LoginInterface() {
@Override
public void loginResult(String msg) {
getView().showMessage(msg);
}
});
}
}
实现MainActivity类
public class MainActivity extends
BaseActivity<MainContact.View, MainContact.Presenter> implements MainContact.View {
Button btn_test;
@Override
public int getLayoutId() {
return R.layout.activity_main;
}
@Override
public MainContact.Presenter createPresenter() {
return new MainPresenter();
}
@Override
public MainContact.View createView() {
return this;
}
@Override
public void init() {
btn_test = findViewById(R.id.test);
btn_test.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
getmPresenter().getMessage("123", "123");
}
});
}
@Override
public void showMessage(String msg) {
Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
}
}
/**
* 得到结果
*/
public interface LoginInterface {
void loginResult(String msg);
}
以上就是我的mvp类所有实现,如果有啥不对或者更好的改进欢迎留言
源代码在我的资源中有