首页 > 编程知识 正文

mvp313,胜方mvp加多少勇者积分

时间:2023-05-04 18:47:11 阅读:149707 作者:4042

以分钟为单位理解MVP模式MVP是从经典模式MVC演变而来的,它们的基本思想有共同点。 控制器/presenter负责逻辑处理,模型提供数据,视图负责显示。 作为新模型,MVP和MVC有很大的区别。 在MVP中,View没有直接使用模型。 它们之间的通信通过presenter (在MVC中为Controller )进行,所有交互都发生在presenter内部,在MVC中View直接来自模型

在MVC中,View可以直接访问模型! 因此,View包含模型信息,必然也包含业务逻辑。 在MVC模型中,关注的是模型的不变性,但同时对模型有多个不同的表示和View。 因此,在MVC模型中,模型不依赖于视图,而视图依赖于模型。 不仅如此,因为一些业务逻辑在View中实现,所以修改View也很困难,至少这些业务逻辑不能重用。

直接看看代码吧。 将可视组件统一视为View。 其中Activity,Fragment也被分类为View层:

主活动:

package com.kakasure.mvpdemo.v; import android.os.Bundle; import Android.support.V7.app.appcompatactivity; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.TextView; import com.kakasure.mvpdemo.R; import com.Kaka sure.MVP demo.callback.activity callback; import com.Kaka sure.MVP demo.p.mainpersenter;/* * @ authordashentao * @ date 20159-21 */publicclassmainactivityextendsappcompatactivityimplementsactivitycallback { puback } @ overrideprotectedvoidoncreate (bundlesavedinstancestate ) super.oncreate ) savedinstancestate; setcontentview (r.layout.activity _ main; Button=(Button ) findviewbyid(r.id.Button1); textview=(textview ) findviewbyid ) r.id.textview1; button.setonclicklistener (new view.onclick listener ) ) @overridepublicvoidonclick ) viewv ) mainpersenter.getinstaaar } ); } @ overridepublicbooleanoncreateoptionsmenu (menu menu ) { //Inflate the menu; thisaddsitemstotheactionbarifitispresent.getmenuinflater ().inflate ) r.menu.menu_main,menu ); 返回真; } @ overridepublicbooleanonoptionsitemselected (menuitem item )//handleactionbaritemclickshere.theactionbarwill/automatemated upbutton,solong//asyouspecifyaparentactivityinandroidmanifest.XML.intid=item.//noinspectionsimplifiableifstattematemem } return super.onoptionsitemselected (it

em); } @Override public void toUI(int action, Object object) { switch (action) { case MainPersenter.ACTION_1: if (object != null) { textview.setText((String) object); } break; default: break; } } @Override protected void onDestroy() { super.onDestroy(); MainPersenter.getInstance().destoryInstance(); }}

P层负责请求的封装与结果的回调:

package com.kakasure.mvpdemo.p;import android.graphics.AvoidXfermode;import android.os.Message;import com.kakasure.mvpdemo.callback.ActivityCallback;import com.kakasure.mvpdemo.m.Model;import java.util.AbstractCollection;/** * Created by Administrator on 2015/9/21. */public class MainPersenter extends BasePersenter { private static MainPersenter persenter; private static Object object = new Object(); public static MainPersenter getInstance() { if (persenter == null) { synchronized (object) { if (persenter == null) { persenter = new MainPersenter(); } } } return persenter; } /** * 操作 */ public void Opreation1(ActivityCallback activityCallback) { mActivityCallback = activityCallback; Model model = new Model(); String result = model.test1(); Message message = Message.obtain(); message.what = ACTION_1; message.obj = result; sendMsg(message); } @Override public void destoryInstance() { if (persenter != null) { persenter = null; object = null; } }}

核心的回调功能具体由BaseP统一负责:

package com.kakasure.mvpdemo.p;import android.os.Handler;import android.os.Looper;import android.os.Message;import com.kakasure.mvpdemo.callback.ActivityCallback;/** * Created by Administrator on 2015/9/21. */public abstract class BasePersenter { protected ActivityCallback mActivityCallback; /** * 动作唯一绑定标志 */ public static final int ACTION_1 = 1; private void toUI(Message msg) { if (mActivityCallback != null) { mActivityCallback.toUI(msg.what, msg.obj); } } private Handler myHandler = new Handler(Looper.myLooper()) { @Override public void handleMessage(Message msg) { super.handleMessage(msg); toUI(msg); } }; protected void sendMsg(Message message) { myHandler.sendMessage(message); } /** * 调用实例销毁时同步销毁Persenter实例,避免单例长期被持有,导致潜在的内存泄露 */ public abstract void destoryInstance();}

Model层:
主要负责数据的组合

package com.kakasure.mvpdemo.m;/** * Created by Administrator on 2015/9/21. */public class Model { public Model() {} public String test1() { StringBuffer sb = new StringBuffer(); for (int i = 0; i < 10; i++) { sb.append(i + ""); } return sb.toString(); }}

回调接口(非常重要):

package com.kakasure.mvpdemo.callback;import android.animation.ObjectAnimator;/** * Created by Administrator on 2015/9/21. */public interface ActivityCallback { /** * return to UI<br/> * * @param action * @param object */ void toUI(int action, Object object);}

BaseP会通过由操作实例注册进来的callback进行数据分发:

button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { MainPersenter.getInstance().Opreation1(MainActivity.this); } }); /** * 操作 */ public void Opreation1(ActivityCallback activityCallback) { mActivityCallback = activityCallback; Model model = new Model(); String result = model.test1(); Message message = Message.obtain(); message.what = ACTION_1; message.obj = result; sendMsg(message); } private void toUI(Message msg) { if (mActivityCallback != null) { mActivityCallback.toUI(msg.what, msg.obj); } } private Handler myHandler = new Handler(Looper.myLooper()) { @Override public void handleMessage(Message msg) { super.handleMessage(msg); toUI(msg); } }; protected void sendMsg(Message message) { myHandler.sendMessage(message); }

最后数据的返回结果丢给调用实例进行处理:
这样View层根本不需要关心数据的组装过程,只关心结果,从而达到功能解耦。

@Override public void toUI(int action, Object object) { switch (action) { case MainPersenter.ACTION_1: if (object != null) { textview.setText((String) object); } break; default: break; } }

有几点需要特别注意:
1:请求动作的Action标志做唯一化,这样容易管理,并且功能区分明显;

public abstract class BasePersenter { protected ActivityCallback mActivityCallback; /** * 动作唯一绑定标志 */ public static final int ACTION_1 = 1;

2 : 当Activity销毁不用时尽量调用destoryInstance释放单例实例,避免长期持有,造成潜在的内存泄露:

@Override protected void onDestroy() { super.onDestroy(); MainPersenter.getInstance().destoryInstance(); }}

这里只是抛砖引玉,具体的封装自己可以随便玩,哈哈

github代码链接:https://github.com/dashentao1989/MvpDemo

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。