Android的MVP

来源:互联网 发布:第一次欧洲旅游知乎 编辑:程序博客网 时间:2024/06/07 06:37

关于AndroidMVP模式

 

M:Model

V:view

P:Presenter

 

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

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

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

 

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

比如下面的接口:

public interfaceIPlaceActivityViewForModel {

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

 

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

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


public class ChoosePlaceOnMapActivityextends Activityimplements IPlaceActivityViewForModel {

    privateMapView mMapView= null;
    private BaiduMapmBaiduMap =null;
    private LocationClientmLocationClient =null;
    private GeoCodermGeoCoder =null;//搜索,地理编码反编码
    privateDouble latitude;
    private Doublelongitude;
    private TextViewtext_view_show_id;

    private LatLnggeocoderLatLng =null;
    private PlacePointPresenterplacePointPresenter =new PlacePointPresenter(this);


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

        placePointPresenter.setIPlaceActivityViewForModel(this);
    }

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

    @Override
    protected voidonCreate(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 voidgetMap(){

        //获取屏幕高度宽度
        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(newBaiduMap.OnMapStatusChangeListener() {

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

            
}

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

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

            
}
        });
    }

    private voidgetLocation(){
        mLocationClient= newLocationClient(getApplicationContext());     //声明LocationClient
        placePointPresenter.setInitBdLocation(mLocationClient);
    }

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

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

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

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

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

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

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

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

    /**
     * 确定按钮的响应
     *
@param view
     */
    
public voidonClickForButtonYes(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 finalString TAG= "PlacePointPresenter";

    private IPlaceActivityViewForModeliPlaceActivityViewForModel;
    private Contextcontext;

    private DealWithPlacePointForModelImpldealWithPlacePointForModel;


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

    public voidsetIPlaceActivityViewForModel(IPlaceActivityViewForModel iPlaceActivityViewForModel){
        this.iPlaceActivityViewForModel= iPlaceActivityViewForModel;
    }

    public voidsetInitGeoCoder(GeoCoder mGeoCoder){
        dealWithPlacePointForModel.doGeoCoder(mGeoCoder, newDealWithPlacePointForModelImpl.OnGeoCoderResultListener() {
            @Override
            public voidonReverseGeoCode(ReverseGeoCodeResult result) {
                iPlaceActivityViewForModel.setTextForTextView(result.getAddress());
                iPlaceActivityViewForModel.getReverseGeoCodeResultBean(result,result.getLocation());
            }

            @Override
            public voidonGeoCoder(GeoCodeResult result) {
            }
            @Override
            public voidonNoResult(String text) {
               iPlaceActivityViewForModel.showToastText(text);
            }
        });
    }


    public voidsetInitBdLocation(LocationClient mLocationClient){
       dealWithPlacePointForModel.doLocation(mLocationClient, newDealWithPlacePointForModelImpl.OnLocationStatusListener() {
           @Override
           public voidonLocationStatusSuccess(LocationResultBean bean) {
               iPlaceActivityViewForModel.getLocationResult(bean);
           }
       });
    }
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0 0