MVP和MVC的区别,在于以前的View层不仅要和model层交互,还要和controller层交互。而在mvp中,view层只和presenter层交互,而model层也和presenter交互,presenter构成了view层和model层的桥梁,也解耦了view层和model层。这一点很关键。我认为,这也是mvp的本质:
解耦view层和model层,让view层和model层通过presenter层进行通信。换个说法就是让诸如网络请求,数据库读写的逻辑,从activity中剥离出来。activit只负责页面的展示,不关心model层的逻辑。
简单的MVP模式,3个class 和 1个interface 就可以实现
各文件主要功能如下:
1个interface:定义activity 要实现的回调方法
3个class:1个Model层定义文件 + 1个业务逻辑 Presenter文件 + 1个Activity文件
列举实现代码
1)interface定义文件
MainCallBack.java
package com.jack.basemvp.basemvp;/**
* 定义要实现的回调方法*/
public interfaceMainCallBack {voidgetMessage(String message);voiderror();
}
2)Model层文件
MainModel.java
package com.jack.basemvp.basemvp;
import okhttp3.Call;
import okhttp3.OkHttpClient;
import okhttp3.Request;/**
* 定Model*/
public classMainModel {publicCall getData(String url) {
OkHttpClient client= newOkHttpClient();
Request request= newRequest.Builder().url(url).build();returnclient.newCall(request);
}
}
3)Presenter层文件
MainPresenter.java
package com.jack.basemvp.basemvp;
import android.support.annotation.NonNull;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;/**
* 定义业务逻辑 Presenter*/
public classMainPresenter {privateMainCallBack callBack;privateMainModel model;publicMainPresenter(MainCallBack callBack) {this.callBack =callBack;
model=newMainModel();
}public voidgetUrlData(String url){
model.getData(url).enqueue(newCallback() {
@Overridepublic voidonFailure(@NonNull Call call, @NonNull IOException e) {
callBack.error();
}
@Overridepublic voidonResponse(@NonNull Call call, @NonNull Response response) throws IOException {
callBack.getMessage(response.body().string());
}
});
}
}
4)activity调用
SimpleMvpActivity.java
package com.jack.basemvp.activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import com.jack.basemvp.R;
import com.jack.basemvp.basemvp.MainCallBack;
import com.jack.basemvp.basemvp.MainPresenter;
import java.lang.ref.WeakReference;public classSimpleMvpActivity extends AppCompatActivity implements View.OnClickListener,MainCallBack{publicEditText simple_et;
Button btn_submit_req;
TextView simple_tv;privateMainPresenter presenter;privateMyHandler handler;
@Overrideprotected voidonCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_simple_mvp);
simple_et=(EditText) findViewById(R.id.simple_et);
btn_submit_req=(Button) findViewById(R.id.btn_submit_req);
simple_tv=(TextView) findViewById(R.id.simple_tv);
handler= new MyHandler(this);
presenter= new MainPresenter(this);
btn_submit_req.setOnClickListener(this);
}
@Overridepublic voidonClick(View v) {switch(v.getId()){caseR.id.btn_submit_req:
String url=simple_et.getText().toString();
presenter.getUrlData(url);break;
}
}
@Overridepublic voidgetMessage(String message) {
Message msg= handler.obtainMessage(0, message);
handler.sendMessage(msg);
}
@Overridepublic voiderror() {
Message msg= handler.obtainMessage(1, "error");
handler.sendMessage(msg);
}private static classMyHandler extends Handler {private WeakReferencereference;privateMyHandler(SimpleMvpActivity activity) {
reference= new WeakReference<>(activity);
}
@Overridepublic voidhandleMessage(Message msg) {
super.handleMessage(msg);
SimpleMvpActivity activity= reference.get();switch(msg.what) {case 0:
activity.simple_tv.setText(msg.obj.toString());break;case 1:
activity.simple_tv.setText(msg.obj.toString());break;
}
}
}
}
具体代码见Github:
转载请著名出处!谢谢~~