MVP(较为深入的一种写法)

以登录模块为例

  • bean类的解读

每一次的接口使用我们都会得到一个包裹着具体对象的Result类,当然这个类的名字自己定义都行.暂且我们定义为Result ,这个类里面包含着属性很容易看出code,msg,data对象,data之前的泛型就代表了这个Result类可以重复使用.一定要记得在public class Result之后加上这个泛型.

public class Result<T> {
    int code;
    String msg;
    T data;
    //底下是我们具体每次请求的具体对象
    }

另一个的bean类自然需要data数据的解读,基本上每个接口对应两个bean类,只不过外面包裹的那一层类(Result)我们共用.

  • Activity的解读

首先因为我们是接口回调所以需要实现实现我们core包下的DataCall里面的类型直接写上

public class LoginActivity extends AppCompatActivity implements View.OnClickListener,
        DataCall<User>

接下来new出LoginPresenter(), 括号里的值就是我们的datacall

LoginPresenter presenter = new LoginPresenter(this);

请求数据

presenter.requestData(mobile, password);

这里因为上面实现了core包下的接口所以会爆红实现两个方法这两个方法自然是我们core包下 接口DataCall的方法.

 @Override
    public void success(User data) {
       /* Toast.makeText(this,data.getUsername(),Toast.LENGTH_LONG).show();
        SharedPreferences.Editor editor = share.edit();
        editor.putString("user",new Gson().toJson(data));
        editor.commit();
        Intent intent = new Intent(this,HomeActivity.class);
        startActivity(intent);
        finish();*/
    }

    @Override
    public void fail(Result result) {
        Toast.makeText(this,result.getCode()+"   "+result.getMsg(),Toast.LENGTH_LONG).show();
    }

以上就是mvp中v的解读

  • Presentler的解读
    Presentler去把Model解析返回的数据进行接口回调给View
/**
  * //这里我们直接继承我们的基础BasePresenter
 */
public class LoginPresenter extends BasePresenter {
    
    //LoginPresenter
    public LoginPresenter(DataCall dataCall) {
        super(dataCall);
    }

    //去Model得到数据(还是动态传值,注意参数)
    @Override
    protected Result getData(Object... args) {
       //调用Model
        Result result = LoginModel.login((String) args[0],(String) args[1]);//调用网络请求获取数据
        return result;
    }
}
  • Model的解读
    这个就是用来请求数据的,感觉没必要太多解释直接调用自己的工具类去拼接接口去请求就好了…
public class LoginModel {

   /* public static Result login(final String mobile, final String pwd){
        String resultString = Utils.postForm("http://www.zhaoapi.cn/user/login",
                new String[]{"mobile","password"},new String[]{mobile,pwd});
 

        Gson gson = new Gson();

        Type type = new TypeToken<Result<User>>() {}.getType();

        Result result= gson.fromJson(resultString,type);

        return result;
    }*/

}
  • core包下的解读
    (主要放一些接口回调的数据),这里抽离了Presentler, 抽离出来了一个BasePresenter
    1.这是我们的基础Interface,很简单吧,这个就是我们Activity中实现的那个接口

public interface DataCall<T> {
   //成功返回了对象
    void success(T data);
  //失败返回了result类
    void fail(Result result);

}

2.这里因为后续代码功能的相似所以我们抽离了我们的Presentler,抽离出来一个基础的Presentler,我们定义为BasePresenter ,这就是为什么我们的登陆的LoginPresentler需要继承我们的BasePresentler…
我们之所以抽离就是为了便于简写代码,实现代码的复用性,大家肯定没有人愿意去敲重复的代码,抽离共有的部分实现简写…所以这里我们抽离了自己的Presentler层…

public abstract class BasePresenter {

    /**
     * 接口回调部分
     */
    DataCall dataCall;

    public BasePresenter(DataCall dataCall){
        this.dataCall = dataCall;
    }

    /**
     * Handler
     * Handler的作用:就是把你Model层解析的东西用来回调给我们的Activity也就是mvp中的view
     */
    Handler mHandler = new Handler(Looper.getMainLooper()) {
        @Override
        public void handleMessage(Message msg) {
            //这个结果是线程传递上来的
            Result result = (Result) msg.obj;

            if (result.getCode()==0){
                //成功回调对象给Activity
                dataCall.success(result.getData());
            }else{
                //失败回调Result给Activity
                dataCall.fail(result);
            }
        }
    };


    /**
     * requestData请求数据的方法(里面参数的值需要注意)
     * ...这个就代表了动态传值
     * @param args
     */
    public void requestData(final Object...args){
        new Thread(new Runnable() {
            @Override
            public void run() {
                //用message传递
                Message message = mHandler.obtainMessage();
                message.obj = getData(args);
                mHandler.sendMessage(message);

            }
        }).start();
    }

    //抽象方法
    protected abstract Result getData(Object...args);

    //防止内存泄漏
    public void unBindCall(){
        this.dataCall = null;
    }
     /**
     *  这个是我们在Activity中的解除本页面接口的绑定方法...
     * 防止内存泄漏使用...当然对应我们上面的unBindCall方法...
     *  @Override
     *     protected void onDestroy() {
     *         super.onDestroy();
     *         presenter.unBindCall();//解除本页面的接口绑定
     *     }
     */

}

到这里就基本的介绍完了…

猜你喜欢

转载自blog.csdn.net/qq_43589739/article/details/85005874