mvp的应用,以及简单实现的代码

           
            时间是一切财富中最宝贵的财富。 —— 德奥弗拉斯多

        首先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的简单了解,后续还会补充,望采纳。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值