时间是一切财富中最宝贵的财富。
|
首先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的简单了解,后续还会补充,望采纳。