1.先嘲笑自己一波,每一个activity都写一个网络请求,都重复的写一遍.当adapter里面需要调用activity的方法时,居然把context改成了activity的名称,然后adapter就不适用其他的activity了.一直想把请求封装出去.然后就没有然后了.
2.MVP的架构虽然还不是理解的很透彻,但是,有了自己的一个理解形式.最难得的是,通过mvp的学习,知道了用接口的形式来实现异步的回调以及基本的封装.
3.MCP最最最难能可贵的是,如果你觉得现在的代码很臃肿,MVC的架构让你看起来快疯掉了,那么,你可以进行局部的MVP改写封装,这简直是没谁了.这是我觉得最最最好的一点.完全可以不影响你现在的代码结构,你只需要把某一小块儿的内容,用MVP封装出去即可.
4.物竞天择适者生存.这句话永远没错的.钉㭌镶嵌,万物不离其中.
所有的都东西,最基本的概念就是MVC,MVC是基本项,MVP是加分项.你把MVP拆封了,会发现原来,还是MVC架构.
5.简单的用代码解释一下自己的感悟.
(1).MVP的套路
activity–>实现view接口;
activity–>实现接口对应的页面响应事件;
将view对象传递给present;
presentimpl–>present接口;
view对象实现activity内的方法;
presentimpl–>interactor接口;
presentimpl–>实现接口对应的方法,和回调方法;
interactorimpl–>实现interactor接口,并执行回调;
(二)8个步骤:我分别给出8个代码片;
public interface Mvp_MyInformationActivityView {
void goToRelease();
void goToReleaseFail();
}
public class Mvp_MyInformationActivity extends Activity implements View.OnClickListener, Mvp_MyInformationActivityView {
private PullLoadMoreRecyclerView pullLoadMoreRecyclerView;
private RelativeLayout rl_back;
private RelativeLayout rlRelease;
private Mvp_MyInformationPresent present;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mvp__my_information);
//初始化id
setViews();
//点击事件
setOnDoclick();
}
//初始化id
private void setViews() {
pullLoadMoreRecyclerView = (PullLoadMoreRecyclerView) findViewById(R.id.pullLoadMoreRecyclerView);
rl_back = (RelativeLayout) findViewById(R.id.rl_back);
rlRelease = (RelativeLayout) findViewById(R.id.rlRelease);
present = new Mvp_MyInformationPresentImp(this);
}
//点击事件
private void setOnDoclick() {
rl_back.setOnClickListener(this);
rlRelease.setOnClickListener(this);
}
//点击事件
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.rl_back:
finish();
break;
case R.id.rlRelease:
present.hasPermessionStorage(this);
break;
}
}
//去发布
@Override
public void goToRelease() {
startActivity(new Intent(Mvp_MyInformationActivity.this, ReleaseInformationActivity.class));
}
//没有权限发布 提示权限
@Override
public void goToReleaseFail() {
HyfToast.showToast(this, "请允许获取手机照片");
}
@Override
protected void onDestroy() {
present.onDestroy();
super.onDestroy();
}
}
//activity里的方法
present = new Mvp_MyInformationPresentImp(this);
//接口类
public interface Mvp_MyInformationPresent {
void hasPermessionStorage(Mvp_MyInformationActivity activity);
void onDestroy();
}
//实现类
public class Mvp_MyInformationPresentImp implements Mvp_MyInformationPresent, Mvp_MyInformationModule.moduleHasPermissionStorage {
private Mvp_MyInformationActivityView view;
private Mvp_MyInformationModule module;
public Mvp_MyInformationPresentImp(Mvp_MyInformationActivityView view) {
this.view = view;
module = new Mvp_MyInformationModuleImp();
}
@Override
public void hasPermessionStorage(Mvp_MyInformationActivity activity) {
module.isRelease(activity, this);
}
@Override
public void onDestroy() {
view = null;
}
//module的回调
@Override
public void moduleToSuccess() {
if (view != null) {
view.goToRelease();
}
}
@Override
public void moduleToFail() {
if (view != null) {
view.goToReleaseFail();
}
}
//module的回调
}
//presentImpl里的方法
//module的回调
@Override
public void moduleToSuccess() {
if (view != null) {
view.goToRelease();
}
}
@Override
public void moduleToFail() {
if (view != null) {
view.goToReleaseFail();
}
}
//module的回调
//presentImpl里的实现的接口
public class Mvp_MyInformationPresentImp implements Mvp_MyInformationPresent, Mvp_MyInformationModule.moduleHasPermissionStorage
//present实现的回调方法,也是view的执行方法
//module的回调
@Override
public void moduleToSuccess() {
if (view != null) {
view.goToRelease();
}
}
@Override
public void moduleToFail() {
if (view != null) {
view.goToReleaseFail();
}
}
//module的回调
//interactor接口类
public interface Mvp_MyInformationModule {
interface moduleHasPermissionStorage {
void moduleToSuccess();
void moduleToFail();
}
void isRelease(Mvp_MyInformationActivity activty, moduleHasPermissionStorage module);
}
//实现类
public class Mvp_MyInformationModuleImp implements Mvp_MyInformationModule {
@Override
public void isRelease(Mvp_MyInformationActivity activity, moduleHasPermissionStorage module) {
boolean error = false;
if (ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
error = true;
module.moduleToFail();
return;
}
if (!error) {
module.moduleToSuccess();
}
}
}
这一整套的逻辑代码下来我相信已经非常的清楚了.
重点来了;重点来了;重点来了;
通过结构的异步分装实现;
我在adapter里面封装了请求:
InformationFragment_ListFragment_Recycle_Interactor interactor = new InformationFragment_ListFragment_Recycle_InteractorImpl(context);
interactor.ToHttpPost(list.get(position).get("user_id") + "", new InformationFragment_ListFragment_Recycle_Interactor.ToListener() {
@Override
public void ToSuccess(String message) {
HyfToast.showToast(context, message);
}
});
我仅仅只用了mvp的interactor和接口就实现了这种方式
//接口类
public interface InformationFragment_ListFragment_Recycle_Interactor {
interface ToListener{
void ToSuccess(String message);
}
void ToHttpPost(String userid , ToListener listener);
}
//实现代码
public class InformationFragment_ListFragment_Recycle_InteractorImpl implements InformationFragment_ListFragment_Recycle_Interactor {
private Context context;
public InformationFragment_ListFragment_Recycle_InteractorImpl(Context context) {
this.context = context;
}
@Override
public void ToHttpPost(String userid, ToListener listener) {
setFollowID(userid, listener);
}
/**
* 添加关注
*/
private void setFollowID(String str01, ToListener listener) {
String url = StaticIP.BUSINESS_FOLLOW;//请求地址
HashMap<String, String> map = new HashMap<>();
map.put("id", str01);
volley_Post_GETID(url, map, "follow", listener);
}
/*****************************
* Volley请求框架
*******************************/
private void volley_Post_GETID(String url, final HashMap<String, String> map, final String type, final ToListener listener) {
StringRequest request = new StringRequest(Request.Method.POST, url,
new Response.Listener<String>() {
@Override
public void onResponse(final String arg0) {
//解析请求结果
if (type.equals("follow")) {
setHttpResultFollowID(arg0, listener);
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(final VolleyError arg0) {
//volley错误状态码处理
VolleyErrorClass volleyerrorclass = new VolleyErrorClass(context);
volleyerrorclass.setLogCat(arg0);
listener.ToSuccess("关注成功");
}
}) {
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
HashMap<String, String> map01 = new HashMap<>();
map01.put("token", new SystemData(context).getToken(StaticData.Token_Key));
Log.i("haha", "头信息" + map01);
return map01;
}
@Override
protected Map<String, String> getParams() throws AuthFailureError {
HashMap<String, String> map01;
map01 = map;
return map01;
}
};
request.setRetryPolicy(new DefaultRetryPolicy(10 * 1000, 0, 0f));
request.setTag("abcPost");
YouMaiApplication.getRequestQueue().add(request);
}
/*****************************Volley请求框架*******************************/
/**
* 解析请求结果 关注
*/
protected void setHttpResultFollowID(String str, ToListener listener) {
Log.i("haha", str);
listener.ToSuccess("关注成功");
}
//所以很神奇,我自己都没想到会误打误撞就解决困惑我这么久的封装问题,所以所有事情都是事出有因,只要你多去尝试新的东西,旧的问题迟早都会因为自己的思想开阔而解决的.真理.
//附上我们上线的应用,大家下载玩一下,有好处的哟!
http://info.appstore.vivo.com.cn/detail/1841175?source=1