Android MVP 模式介绍与示例

2016-11-25  本文已影响73人  五谷观精分道长

MVP模式是什么?

MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。

MVP与MVC区别

一张图即可看懂


图片来自互联网

一个简单的示例NewsMvp

整体类结构

QQ截图20161125085423.png

MVP模式结构

  1. Model: 业务逻辑和实体模型。
  2. View:用户交互和视图显示,在android中对应activity。
  3. Presenter: 负责完成View于Model间的逻辑和交互。
MVP模式.png

<接口是为了提高代码的可用性,可以不使用>

核心代码

Model层获取网络数据:

public class NewsModel implements InNewsModel {
    News news;

    @Override
    public News getNews() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                Gson gson = new Gson();
                news=gson.fromJson(HttpGet.request(""),News.class);
               // Log.d("xx", news.getNewslist().get(0).getTitle());
            }
        }).start();
        //主线程等待一秒
        sleep(1000);
       // Log.d("", news.getNewslist().get(0).getTitle());
        return news;


    }
}

View层把view传到Presenter层,并且加载从Presenter层获取的数据

mNewsPresenter = new NewsPresenter(this);
        mNewsPresenter.loadNews();

@Override
    public void addNews(News news) {
        lv = (ListView) findViewById(R.id.listview);
        // Log.d("xx",news.getNewslist().get(0).getTitle());
            SimpleAdapter adapter = new SimpleAdapter(this, getData(news),
                    R.layout.listview_item, new String[]{"img", "title", "info"},
                    new int[]{R.id.img, R.id.title, R.id.info});

            lv.setAdapter(adapter);
        
    }
    private List<Map<String, Object>> getData(News news) {
        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
        Map<String, Object> map = new HashMap<String, Object>();
        for (News.NewslistBean newslistBean : news.getNewslist()) {
            map = new HashMap<String, Object>();
            map.put("img", R.drawable.ic_menu_camera);
            map.put("title", newslistBean.getTitle());
            map.put("info", newslistBean.getDescription());
            list.add(map);
        }
        return list;
    }

Presenter层通过NewsModel获取数据传给View层

@Override
    public void loadNews() {
        //通过调用IInfoView的方法来更新显示,设计模式运用
        //类似回调监听处理
        mInNewsView.addNews(mNewsModel.getNews());
    }

2016-11-24-9423b24e9f46bbbc53741289a5134728.png

关于接口调用失败,我测试发现天行数据失败。到后台发现原来是请求的次数超过上限了。(主要是大家用的都是我的账号,10000次请求分分钟就没了),所以各位可以自行申请账号。

QQ截图20161125095311.png

示例项目地址:https://github.com/HuRuWo/NewsByMVP

QQ截图20161125103332.png
上一篇下一篇

猜你喜欢

热点阅读