如果想知道MVPPlugin的使用的话可以看一下这个链接,非常详细:http://mp.weixin.qq.com/s/fo34hyvjzNSURSh_V8y4oQ
根据链接创造出来的项目如下:
LoginActivity.java,LoginPresenter.java,LoginContract.java三个文件都是由MVPPlugin插件自动创建的,然后我根据登陆需要进行的操作进行完善一下。
然后我们进入到LoginActivity.java文件看一下内容是啥:
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import com.example.administrator.mvpfiletest.R;
import com.example.administrator.mvpfiletest.mvp.MVPBaseActivity;
/**
* MVPPlugin
*/
public class LoginActivity extends MVPBaseActivity<LoginContract.View, LoginPresenter> implements LoginContract.View {
TextView log;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
log = (TextView) findViewById(R.id.log);
final EditText name = (EditText) findViewById(R.id.name);
final EditText pwd = (EditText) findViewById(R.id.pwd);
findViewById(R.id.login).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mPresenter.onlogin(name.getText().toString(),pwd.getText().toString());
}
});
}
@Override
public void onSuccess() {
log.setText("登陆成功");
}
@Override
public void onError() {
log.setText("登陆失败");
}
}
可以看到LoginActivity是继承于MVPBaseActivity的,代表View层,这个View层的作用是一般也就做加载UI视图、设置监听再交由Presenter处理的一些工作,本层所需要做的操作就是在每一次有相应交互的时候,调用presenter的相关方法就行。然后还传递了两个泛型进去,分别是BaseView的子类LoginContract.View跟BasePresenterImpl的子类LoginPresenter,
然后看看MVPBaseActivity里面是啥:
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import java.lang.reflect.ParameterizedType;
/**
* MVPPlugin
* 邮箱 784787081@qq.com
*/
public abstract class MVPBaseActivity<V extends BaseView,T extends BasePresenterImpl<V>> extends AppCompatActivity implements BaseView{
public T mPresenter; // T等价于LoginPresenter
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPresenter= getInstance(this,1);
mPresenter.attachView((V) this); //V等价于LoginContract.View接口
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mPresenter!=null)
mPresenter.detachView();
}
@Override
public Context getContext(){
return this;
}
public <T> T getInstance(Object o, int i) {
try {
return ((Class<T>) ((ParameterizedType) (o.getClass()
.getGenericSuperclass())).getActualTypeArguments()[i])
.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassCastException e) {
e.printStackTrace();
}
return null;
}
}
可以看到MVPBaseActivity其实就是通过getInstance创建了LoginPresenter实例,然后通过attachView把LoginContract.View的接口实例传递进去给LoginPresenter的父类BasePresenterImpl的mView,进去看一下BasePresenterImpl的函数:
public class BasePresenterImpl<V extends BaseView> implements BasePresenter<V>{
protected V mView;
@Override
public void attachView(V view) {
mView=view;
}
@Override
public void detachView() {
mView=null;
}
}
BasePresenter的接口内容:
public interface BasePresenter <V extends BaseView>{
void attachView(V view);
void detachView();
}
可以看出MVPBaseActivity的作用是使得LoginPresenter实例化,然后使得LoginContract.View实例化,这样在后面的使用时候可以用mPresenter来处理逻辑关系,用mView来更新View视图
所以LoginPresenter的内容如下:
public class LoginPresenter extends BasePresenterImpl<LoginContract.View> implements LoginContract.Presenter{
@Override
public void onlogin(String name, String pwd) { //处理耗时的操作 比如访问服务器,数据库 根据结果调用不同的接口
if (name.equals("test") && pwd.equals("123")){
mView.onSuccess();
}else {
mView.onError();
}
}
}
总结一下LoginPresenter可以控制UI更新,然后可以在这边做一些耗时的工作,MVPBaseActivity是实例化了mPresenter,跟后面用来更新UI的mView
不是说处理耗时的操作要放在Model上面吗!怎么在Presenter层上面就做了那些耗时的操作了?然后Model层在哪里?怎么只看到了Presenter跟View层呢?!这哪里是标准的MVP模式!!!其实这边是没有model的,但是要加的话也是可以的,LoginModel如下:public class LoginModel implements LoginContract.Model {
@Override
public void login(String name, String pwd,LoginContract.LoginResult result) {
if (name.equals("test") && pwd.equals("123")){
result.onSuccess();
}else {
result.onError();
}
}
}
然后要在LoginContract增加一个Model有结果时候对LoginPresenter操作的接口:
interface LoginResult{
void onSuccess();
void onError();
}
然后在LoginPresenter实现这个接口:
public class LoginPresenter extends BasePresenterImpl<LoginContract.View> implements LoginContract.Presenter,LoginContract.LoginResult{
@Override
public void onlogin(String name, String pwd) { //处理耗时的操作 比如访问服务器,数据库 根据结果调用不同的接口
LoginContract.Model model = new LoginModel();
model.login(name,pwd,this);
}
@Override
public void onSuccess() {
mView.onSuccess();
}
@Override
public void onError() {
mView.onError();
}
这样做Model层是有了,但是感觉是不是比刚才麻烦了许多?增加了许多的接口,然后逻辑也变得复杂了,而且耦合性并没有降低。然后看了一下MVPPlugin的代码。这样做的Presenter层有点像Model跟Presenter结合起来,反正我是觉得MVPPlugin这样搞会比较爽一些。。。。当然了。。有点牵强。希望有人能补充一下。。哪里说的不对请指正