Android中MVC的使用

来源:互联网 发布:机械加工工艺编制软件 编辑:程序博客网 时间:2024/06/03 10:34

AndroidMVC的使用

模型层(Model)

我们针对业务模型,建立的数据结构和相关的类,就可以理解为AndroidApp的Model,Model是与View无关,而与业务相关的。对数据库的操作、对网络等的操作都应该在Model里面处理,当然对业务计算等操作也是必须放在的该层的。就是应用程序中二进制的数据。

视图层(View)

一般采用XML文件进行界面的描述,这些XML可以理解为AndroidApp的View。使用的时候可以非常方便的引入。同时便于后期界面的修改。逻辑中与界面对应的id不变化则代码不用修改,大大增强了代码的可维护性。

控制层(Controller)

Android的控制层的重任通常落在了众多的Activity的肩上。这句话也就暗含了不要在Activity中写代码,要通过Activity交割Model业务逻辑层处理,这样做的另外一个原因是Android中的Actiivity的响应时间是5s,如果耗时的操作放在这里,程序就很容易被回收掉。

模型层(Model

对数据库的操作、对网络、业务计算等操作都应该在Model里面处理。

代码如下:

1. 先写一个接口

public interface Model {    void getData(String url, ModelListener modelListener);}

2. 继承接口进行数据请求

public class ModelUrl implements Model {    @Override    public void getData(String url, final ModelListener modelListener) {        OkHttpClient okHttpClient = new OkHttpClient();        //RequestBody requestBody = new  FormEncodingBuilder().add().build();        Request request = new Request.Builder().url(url).get().build();        okHttpClient.newCall(request).enqueue(new Callback() {            @Override            public void onFailure(Request request, IOException e) {            }            @Override            public void onResponse(Response response) throws IOException {                if (response.isSuccessful()) {                    String json = response.body().string();                    if (modelListener != null) {                        modelListener.onSuccess(json);                    } else {                        modelListener.onError();                    }                }            }        });    }}

视图层(View

使用XML文件进行绘制应用界面,这些XML可以理解为Android的View。而且便于后期界面的修改。如果逻辑与界面对应的id不变化,则代码不用修改,大大增强了代码的可维护性。

布局文件如下:

<?xml version="1.0"encoding="utf-8"?><LinearLayout    xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical">    <Button        android:id="@+id/btn"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="center_horizontal"        android:text="请求数据"/>    <ImageView        android:id="@+id/img"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:src="@mipmap/ic_launcher"/></LinearLayout>

控制层(Controller

Android的控制层的就是Activity。所以尽量不要在Activity中写逻辑,要将业务逻辑通过Activity转接到Model业务逻辑层处理,还有就是Android中的Actiivity的响应时间是5s,如果耗时的操作放在这里,程序就很容易崩溃。

代码如下:

public class ControllerActivtiy extends Activity implements OnModelListener, View.OnClickListener {    private Model mModel;    private String mUrl = "http://f11.baidu.com/it/u=2411014588,4228628336&fm=72";    private Button mButton;    private ImageView mImageView;    private String mImageUrl;    private Gson mGson;    private Bitmap mBitmap;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main_activity);        initView();        initData();    }    public void initView() {        mButton = (Button) findView(R.id.btn);        mImageView = (ImageView) findView(R.id.img);        mButton.setOnClickListener(this);        mGson = new Gson();        mModel = new ModelUrl();    }    @Override    public void onClick(View v) {        switch (v.getId()) {            case R.id.btn:                mModel.getData(mUrl, ControllerActivtiy.this);                break;        }    }    Handler handler = new Handler() {        @Override        public voidhandleMessage(Message msg) {            super.handleMessage(msg);            mImageView.setImageBitmap(mBitmap);        }    };    /**     * 获取网落图片资源     *     * @return     * @paramurl     */    public static Bitmap getHttpBitmap(String url) {        URL myFileURL;        Bitmap bitmap = null;        try {            myFileURL = new URL(url);            //获得连接            HttpURLConnection conn = (HttpURLConnection) myFileURL.openConnection();            //设置超时时间为6000毫秒,conn.setConnectionTiem(0);表示没有时间限制            conn.setConnectTimeout(6000);            //连接设置获得数据流            conn.setDoInput(true);            //不使用缓存            conn.setUseCaches(false);            //这句可有可无,没有影响            //conn.connect();            //得到数据流            InputStream is = conn.getInputStream();            //解析得到图片            bitmap = BitmapFactory.decodeStream(is);            //关闭数据流            is.close();        } catch (Exception e) {            e.printStackTrace();        }        returnbitmap;    }    @Override    public void onSuccess(String result) {        PictureBean pictureBean = mGson.fromJson(result, PictureBean.class);        List<PictureBean.DataBean> list = pictureBean.getData();        if (list != null) {            mImageUrl = list.get(0).getImage_url();            mBitmap = getHttpBitmap(mImageUrl);            Message message = new Message();            handler.sendEmptyMessage(0);        }    }    @Override    public void onError() {    }}

以上代码看出,这里设计了一个Model模型接口,然后实现了接口ModelUrl类。controller控制器activity调用ModelUrl类中的方法发起网络请求,然后通过实现ModelListener接口来获得网络请求的结果通知View视图层更新UI 。至此,Activity就将View视图显示和Model模型数据处理隔离开了。activity担当contronller完成了model和view之间的协调作用。

至于这里为什么不直接设计成类里面的一个getData()方法直接请求网络数据?你考虑下这种情况:现在代码中的网络请求是使用Volley框架来实现的,如果哪天老板非要你使用Afinal框架实现网络请求,你怎么解决问题?难道是修改 getData()方法的实现?这样修改不仅破坏了以前的代码,而且还不利于维护,考虑到以后代码的扩展和维护性,我们选择设计接口的方式来解决着一个问题,我们实现另外一个ModelWithAfinalImpl类,继承自Model,重写里面的方法,这样不仅保留了以前的ModelUrl类请求网络方式,还增加了ModelWithAfinalImpl类的请求方式。Activity调用代码无需要任何修改。

MVC的缺点

Android开发中,Activity并不是一个标准的MVC模式中的Controller,它的首要职责是加载应用的布局和初始化用户界面,接受并处理来自用户的操作请求,进而作出响应。随着界面及其逻辑的复杂度不断提升,Activity类的职责不断增加,以致变得庞大臃肿。

注:

MVC(Model(model)--View(xml)--Controller(activity))

Activity加载应用的布局和初始化用户界面xml,根据用户操作,调用Model获取数据,并调用回调设置View的显示

MVP(Model(model)--View(activity、xml、fragment、adapter)--Presenter(activity))

Activity/Fragment/Adapter启动后,实例化响应的PresenterApp的控制权由View层转移到Presenter,Presenter找Model层做事,然后将完成的结果更新到View层,Presenter和View两者之间通信使用BroadCast、Handler或者接口完成,只传递事件和结果,

 

 

 

 

原创粉丝点击