Android中MVC的使用

xiaoxiao2021-02-28  81

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或者接口完成,只传递事件和结果,

 

 

 

 

转载请注明原文地址: https://www.6miu.com/read-21174.html

最新回复(0)