Android MVPPlugin插件例子说明

如果想知道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这样搞会比较爽一些。。。。当然了。。有点牵强。希望有人能补充一下。。哪里说的不对请指正







  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值