Android的MVP

原创 2016年08月30日 19:39:04

关于AndroidMVP模式

 

M:Model

V:view

P:Presenter

 

M:用来处理比较繁杂的业务逻辑

V:负责界面的更新和界面数据的获取,也可以和之前一般的做法,处理一些比较简易的逻辑

P:介于MV之间,个人理解的作为MV的连接通信的桥梁

 

View一般的做法是定义一个接口,用于处理更新等业务

比如下面的接口:

public interface IPlaceActivityViewForModel {

    void setTextForTextView(String text);
    void getLocationResult(LocationResultBean bean);
    void getReverseGeoCodeResultBean(ReverseGeoCodeResult beanResult, LatLng locationLatLng);
    void showToastText(String text);
}

 

在对应的Activity实现上述接口的方法

比如(这是一个百度地图的例子):


public class ChoosePlaceOnMapActivity extends Activity implements IPlaceActivityViewForModel {

    private MapView mMapView = null;
    private BaiduMap mBaiduMap = null;
    private LocationClient mLocationClient = null;
    private GeoCoder mGeoCoder = null;// 搜索,地理编码反编码
    private Double latitude;
    private Double longitude;
    private TextView text_view_show_id;

    private LatLng geocoderLatLng = null;
    private PlacePointPresenter placePointPresenter = new PlacePointPresenter(this);


    @Override
    protected void onStart() {
        super.onStart();
        getLocation();
        getGeoCoder();

        placePointPresenter.setIPlaceActivityViewForModel(this);
    }

    @Override
    protected void onRestart() {
        super.onRestart();
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_place_onmap);
        mMapView = (MapView) this.findViewById(R.id.place_map);
        mBaiduMap = mMapView.getMap();
        text_view_show_id = (TextView) this.findViewById(R.id.text_view_show_id);
    }


    private void getMap(){

        //获取屏幕高度宽度
        WindowManager wm = (WindowManager) this
                .getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics dm = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(dm);
        int width = dm.widthPixels;
        int height = dm.heightPixels;

    //    mMapView.removeViewAt(1);        //去掉logo
        mMapView.showZoomControls(true);


        //获得百度地图状态
        MapStatus.Builder builder = new MapStatus.Builder();
//      builder.targetScreen(new Point(width/2,height/2));
        //定位的坐标点
        LatLng latLng = new LatLng(latitude, longitude);
//      BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher);
//      OverlayOptions overlay = new MarkerOptions().position(latLng).icon(bitmap);
//      map.addOverlay(overlay);
        //设置地图中心为定位点
        builder.target(latLng);
        //设置缩放级别 18对应比例尺50
        builder.zoom(18);
        MapStatus mapStatus = builder.build();
        MapStatusUpdate m = MapStatusUpdateFactory.newMapStatus(mapStatus);
        mBaiduMap.setMapStatus(m);
        mBaiduMap.setOnMapStatusChangeListener(new BaiduMap.OnMapStatusChangeListener() {

            @Override
            public void onMapStatusChangeStart(MapStatus arg0) {
                // TODO Auto-generated method stub

            
}

            @Override
            public void onMapStatusChangeFinish(MapStatus arg0) {
                // TODO Auto-generated method stub
                
LatLng target = mBaiduMap.getMapStatus().target;
                System.out.println(target.toString());
                mGeoCoder.reverseGeoCode(new ReverseGeoCodeOption().location(target));
            }

            @Override
            public void onMapStatusChange(MapStatus arg0) {
                // TODO Auto-generated method stub

            
}
        });
    }

    private void getLocation(){
        mLocationClient = new LocationClient(getApplicationContext());     //声明LocationClient
        placePointPresenter.setInitBdLocation(mLocationClient);
    }

    public void showToastText(String text){
        Toast.makeText(ChoosePlaceOnMapActivity.this, text, Toast.LENGTH_LONG).show();
    }

    private void getGeoCoder(){
        mGeoCoder = GeoCoder.newInstance();
        placePointPresenter.setInitGeoCoder(mGeoCoder);
    }

    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        
super.onPause();
        mMapView.onPause();
    }

    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        
super.onResume();
        mMapView.onResume();
    }

    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        
super.onDestroy();
        mMapView.onDestroy();
        mLocationClient.stop();
        mGeoCoder.destroy();
    }

    @Override
    public void setTextForTextView(String text) {
        text_view_show_id.setText(text);
    }

    @Override
    public void getLocationResult(LocationResultBean bean) {
        latitude = bean.latitude;
        longitude = bean.longitude;
        setTextForTextView(bean.address);
        getMap();
    }

    @Override
    public void getReverseGeoCodeResultBean(ReverseGeoCodeResult beanResult, LatLng locationLatLng) {
        geocoderLatLng = beanResult.getLocation();
    }

    /**
     * 确定按钮的响应
     *
@param view
     */
    
public void onClickForButtonYes(View view){
        String placeText = text_view_show_id.getText().toString();
        Intent intent = new Intent();
        intent.putExtra("LatLng", geocoderLatLng);
        intent.putExtra("text", placeText);
        ChoosePlaceOnMapActivity.this.setResult(3, intent);
        ChoosePlaceOnMapActivity.this.finish();
    }

}

 

其中PlacePointPresenter

就是Presenter,具体代码如下,当中使用到上面定义的接口,接口中的方法在Activity,也就是我们说的View层中实现,在Presenter中进行调用,那么调用的地方一般就是在业务逻辑处理后,具体根据需要做判断吧,当中自然也就包含了业务逻辑实现的类DealWithPlacePointForModelImpl ,此类内容在本文中就不再给出了。


public class PlacePointPresenter {

    private static final String TAG = "PlacePointPresenter";

    private IPlaceActivityViewForModel iPlaceActivityViewForModel;
    private Context context;

    private DealWithPlacePointForModelImpl dealWithPlacePointForModel;


    public PlacePointPresenter(Context context){
        this.context = context;
        dealWithPlacePointForModel = new DealWithPlacePointForModelImpl(context);
    }

    public void setIPlaceActivityViewForModel(IPlaceActivityViewForModel iPlaceActivityViewForModel){
        this.iPlaceActivityViewForModel = iPlaceActivityViewForModel;
    }

    public void setInitGeoCoder(GeoCoder mGeoCoder){
        dealWithPlacePointForModel.doGeoCoder(mGeoCoder, new DealWithPlacePointForModelImpl.OnGeoCoderResultListener() {
            @Override
            public void onReverseGeoCode(ReverseGeoCodeResult result) {
                iPlaceActivityViewForModel.setTextForTextView(result.getAddress());
                iPlaceActivityViewForModel.getReverseGeoCodeResultBean(result, result.getLocation());
            }

            @Override
            public void onGeoCoder(GeoCodeResult result) {
            }
            @Override
            public void onNoResult(String text) {
               iPlaceActivityViewForModel.showToastText(text);
            }
        });
    }


    public void setInitBdLocation(LocationClient mLocationClient){
       dealWithPlacePointForModel.doLocation(mLocationClient, new DealWithPlacePointForModelImpl.OnLocationStatusListener() {
           @Override
           public void onLocationStatusSuccess(LocationResultBean bean) {
               iPlaceActivityViewForModel.getLocationResult(bean);
           }
       });
    }
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

android中MVP模式(一)

1. 明确需求,界面如下:可存,可根据id读取数据。
  • knxw0001
  • knxw0001
  • 2014年09月28日 09:41
  • 142624

Android MVP模式的坑

MVP 坑
  • brycegao321
  • brycegao321
  • 2016年08月09日 15:19
  • 2467

浅谈 MVP in Android

一、概述 对于MVP(Model View Presenter),大多数人都能说出一二:“MVC的演化版本”,“让Model和View完全解耦”等等。本篇博文仅是为了做下记录,提出一些自己的看法,和...
  • lmj623565791
  • lmj623565791
  • 2015年06月23日 09:11
  • 229761

Android一个mvp模式的小例子

MVP模式的是什么就不说了,反正用MVP模式写多了就是感觉爽多了,特别是后期改代码、维护什么的就不用那么麻烦了。这边文章就用登录的例子来写一个小小的mvp例子。 布局文件很简单,两个编辑框和一个按钮...
  • koma025
  • koma025
  • 2016年10月20日 15:12
  • 1146

android MVP——mvp架构的应用和优化

MVP架构在android还是很好用的。我也在试着将mvp用在项目中。下面我就来说说mvp模式的应用和优化。mvp模式的概念MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Contr...
  • yehui928186846
  • yehui928186846
  • 2016年05月27日 20:06
  • 4133

Android MVP开发模式 google 官方Mvp架构详解

Google官方MVP Sample代码解读 关于Android程序的构架, 当前最流行的模式即为MVP模式, Google官方提供了Sample代码来展示这种模式的用法. Repo地址: andr...
  • jungle_pig
  • jungle_pig
  • 2017年03月24日 09:19
  • 6344

Android之MVP模式实现登录和网络数据加载

MVP简介 相信大家对 MVC 都是比较熟悉了:M-Model-模型、V-View-视图、C-Controller-控制器,MVP作为MVC的演化版本,也是作为用户界面(用户层)的实现模式,那么类似...
  • DickyQie
  • DickyQie
  • 2017年02月06日 16:37
  • 1563

Android中MVP模式讲解及实践

前两年的时候,我经常逛http://androidweekly.net这个网站,上面就有过很多文章介绍MVP模式,我很感兴趣,于是把这个东西介绍给身边的同事,同事们好像没有多大反应,可能是当时在国内M...
  • briblue
  • briblue
  • 2016年10月17日 15:44
  • 5055

Android架构(一)MVP架构在Android中的实践

欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/54783106 本文出自:【余志强的博客】 为什...
  • johnny901114
  • johnny901114
  • 2017年01月30日 16:05
  • 5417

Android MVP架构简单封装

最近在研究MVP和MVVM架构模式,看了看觉得还是MVP好做点,特意查查资料,做了下简单的封装。先看一下自己封装项目的基本库结构。 来看看源码吧 BasePresenter.javapubli...
  • u011625768
  • u011625768
  • 2016年05月29日 20:13
  • 1788
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android的MVP
举报原因:
原因补充:

(最多只允许输入30个字)