mvp的应用,以及简单实现的代码
来源:互联网 发布:windows的应用 编辑:程序博客网 时间:2024/05/20 16:32
时间是一切财富中最宝贵的财富。
首先mvp是从经典模式mvc演变而来,它们的基本思想有相通的地方,controller/presenter 负责逻辑处理,Model提供数据,view负责显示,作为一种新的模式,mvp和mvc有着一个重大区别:在mvp中view并不直接使用model,它们之间的通信时通过presenter来进行的,所有的交互都发生在 presenter内部,而mvc中的view会从model中直接读取数据而不是通过controller.
我先说一下它们的思想,mvp的主要目的是为了使耦合性降低。
假如你用mvp框架要做一个网络请求,第一次会感觉到没有思路,首先你要分三个包,model,presenter,view包,
model层主要是负责数据的,view层负责展示,model和view不能直接进行交互,需要用到presenter. 所以在model层负责请求得到数据,
//这是model层 的接口
public interface Modeinterface {//第一个是接口url,第二个是接口,里面封装的方法主要是成功的方法和失败的方法 void getdata(String url,Newsinterface newsinterface);}
//这是接口主要是成功和失败的方法public interface Newsinterface { void onsuccess(List<News.ResultBean.RowsBean> rows);//里面的参数,根据自己的需求定义 void fail(String error);}//接下来实现model层
public class Modeimprent implements Modeinterface { private List<News.ResultBean.RowsBean> rows; @Override public void getdata(String url, final Newsinterface newsinterface) { //创建okHttpClient对象 OkHttpClient mOkHttpClient = new OkHttpClient(); //创建一个Request final Request request = new Request.Builder() .url(url) .build(); //new call Call call = mOkHttpClient.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Request request, IOException e) { //在这里是把Newsinterface接口注册一下,调用的时候使用的是接口回掉的原理
newsinterface.fail(request.toString()); } @Override public void onResponse(Response response) throws IOException { final String res = response.body().string(); Gson g1=new Gson(); News news = g1.fromJson(res, News.class); News.ResultBean result = news.getResult(); rows = result.getRows(); Log.i("kkkkk",rows.size()+""); newsinterface.onsuccess(rows); } }); }}
大家或许会感到奇怪,为什么会model层会使用接口。
为什么要用接口 :用于处理多变的情况。接口在实际开发过程中最大好处是,你可以按照设计,先把接口写好,然后分配大伙干活的时候,告诉a们去用写好的接口去实现他们的具体功能,而告诉b们,去写那些已经写好但是没有具体的代码的接口,这样可以提高工作效率。并且底层和应用也通过接口做了一个很明显的分层。
接下来是view层,view层需要展示,那就要考虑到成功的展示和失败的展示。所以在view层也定义一个接口,分别是成功的方法和失败的方法,
public interface NewsView {//参数也是根据需求来填,和model层要一致 void onsuccess(List<News.ResultBean.RowsBean> rows); void fail(String error);}在view层定义好接口后,根据接口回掉的原理,需要去注册一下,但是又不能直接去model层,需要去presenter层
public class Newspresenter { private NewsView newview;//这是view层的 private Modeinterface modeinterface;//这是model层的 public Newspresenter(NewsView newview) { this.newview=newview; modeinterface=new Modeimprent(); } //定义一个方法,可以很好的和view层进行好的交互, public void gain(String url) {//直接调用model层的方法,获得数据,因为这个接口已经注册过了,直接调用就可以得到值 modeinterface.getdata(url, new Newsinterface() { @Override public void onsuccess(List<News.ResultBean.RowsBean> rows) { //view层的接口直接在这里注册 newview.onsuccess(rows); } @Override public void fail(String error) { newview.fail(error); } }); }}最后就是Mainactivity了,
public class MainActivity extends AppCompatActivity implements View.OnClickListener,NewsView{ private Button but_success; private Button but_fail; private ListView list_view; private Newspresenter newspresenter; String url="http://api.fang.anjuke.com/m/android/1.3/shouye/recInfosV3/?city_id=14&lat=40.04652&lng=116.306033&api_key=androidkey&sig=9317e9634b5fbc16078ab07abb6661c5&macid=45cd2478331b184ff0e15f29aaa89e3e&app=a-ajk&_pid=11738&o=PE-TL10-user+4.4.2+HuaweiPE-TL10+CHNC00B260+ota-rel-keys%2Crelease-keys&from=mobile&m=Android-PE-TL10&cv=9.5.1&cid=14&i=864601026706713&v=4.4.2&pm=b61&uuid=1848c59c-185d-48d9-b0e9-782016041109&_chat_id=0&qtime=20160411091603"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initview(); //在这里需要先执行presenter的操作 newspresenter = new Newspresenter(this); newspresenter.gain(url); } private void initview() { but_success = (Button) findViewById(R.id.but_success); but_fail = (Button) findViewById(R.id.but_fail); list_view = (ListView) findViewById(R.id.list_view); but_success.setOnClickListener(this); but_fail.setOnClickListener(this); } @Override public void onClick(View v) { switch(v.getId()) { case R.id.but_success: break; case R.id.but_fail: break; } } @Override public void onsuccess(final List<News.ResultBean.RowsBean> rows) { //因为我用的是okhttp,原先的操作实在子线程,但数据展示需要在主线程。 runOnUiThread(new Runnable() { @Override public void run() { Myadpter m1=new Myadpter(MainActivity.this,rows); list_view.setAdapter(m1); } }); } @Override public void fail(String error) { Toast.makeText(this, error+"", Toast.LENGTH_SHORT).show(); }}以上就是我对mvp的简单了解,后续还会补充,望采纳。
0 0
- mvp的应用,以及简单实现的代码
- 初识MVP以及简单应用
- MVP架构的简单实现
- MVP简单的实现登录
- android开发MVP模式的简单应用
- Android中MVP模式的简单应用
- MVP 深引用方式的简单实现
- Android mvp的简单使用和实现
- Android中MVP模式的简单实现
- Mvp+Rxandroid+Retrofit的简单实现
- Android MVP模式的简单实现
- Android最简单的方式实现MVP
- kotlin实现 简单的MVP模式
- 简单的用MVP实现登录界面
- mvp的基本登录(简单实现)
- MVP的简单实现(本地登陆)
- 简单的Android中MVP模式的应用
- MVP的简单理解
- 基于js对象,操作属性、方法详解
- 最基础SSM(spring springmvc mybatis)框架整合入门解析
- NYOJ 06 喷水装置(一)
- Java 开发手册之编程规约
- 什么是jsp?
- mvp的应用,以及简单实现的代码
- phabricator用法
- Intent实现组件之间通信
- 正则表达式符号
- 【计算机视觉】目标检测中的指标衡量Recall与Precision
- 三层架构及分层
- pthread_cond_broadcast相关
- 调用远程方法,返回json数据,并解析
- 信号量、互斥体和自旋锁