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
原创粉丝点击