android mvc开发框架,Android MVC架构设计

MVC架构设计·源码

市面上超过半数的APP都是MVC的一个架构体系,包括现在我司正在开发的项目也是用的MVC架构体系,为啥不选用MVP或者MVVM,中小型且开发周期短协同开发人员少的项目MVC就很合适了。Android中对MVC并没有一个很严格的定义,所以记录一下我对于MVC的理解以及MCV架构存在的缺陷的分析。

MVC流程分析

View接收到用户的操作

View将用户的操作,交给Controller

Controller完成具体的业务逻辑

得到结果封装成Model,再进行View的更新

1e2adb415f27

image.png

从上图中可以看出,Controller是作为一个媒介,处于Model和View之间。Model和View之间有紧密的联系,耦合性较强

MVC划分

那到底MVC在Android项目中是怎么划分的呢,看下面一个Demo,点击按钮获取网络图片转换为Bitmap并显示到ImageView中

1e2adb415f27

image.png

Controller:Activity和Fragment(ImageDewnLoad和Callback只是为了我们解耦Activity中的代码,你也可以把它全写在Activity中,但是后期维护会比较困难)

Model:实体类作为Model层,一般我们会在项目中创建一个bean包放置各种ModelBean,比如网络请求返回的UserBean和本案例中的ImageBean

View:MXL和自定义View等

通过代码看一下具体MVC各层次内容

1.View层

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

tools:context=".MainActivity">

android:id="@+id/bt_get_picture"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:onClick="getImage"

android:text="获取图片" />

android:id="@+id/iv_picture"

android:layout_width="200dp"

android:layout_height="200dp"

android:layout_gravity="center_horizontal" />

2.Model层,定义了图片路径和图片Bitmap对象的实体类

public class ImageBean {

// 网络图片地址

private String requestPath;

// 结果返回bitmap对象

private Bitmap bitmap;

public String getRequestPath() {

return requestPath;

}

public void setRequestPath(String requestPath) {

this.requestPath = requestPath;

}

public Bitmap getBitmap() {

return bitmap;

}

public void setBitmap(Bitmap bitmap) {

this.bitmap = bitmap;

}

}

3.Controller层,MainActivity作为Controller层

public class MainActivity extends AppCompatActivity implements Callback {

private ImageView imageView;

private static final String path = "http://photocdn.sohu.com/20130416/Img372885486.jpg";

private Handler handler = new Handler(new Handler.Callback() {

@Override

public boolean handleMessage(Message msg) {

switch (msg.what) {

case ImageDownloader.SUCCESS://请求成功

imageView.setImageBitmap((Bitmap) msg.obj);

break;

case ImageDownloader.ERROR://请求失败

Toast.makeText(MainActivity.this, "下载失败", Toast.LENGTH_SHORT).show();

break;

}

return false;

}

});

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

imageView = findViewById(R.id.iv_picture);

}

/**

* 点击事件,获取图片

*

* @param view

*/

public void getImage(View view) {

ImageBean imageBean=new ImageBean();

imageBean.setRequestPath(path);

ImageDownloader.down(this,imageBean);

}

@Override

public void callback(int resultCode, ImageBean bitmap) {

Message message = handler.obtainMessage(resultCode);

message.obj = bitmap.getBitmap();

handler.sendMessageDelayed(message, 500);

}

}

Callback接口定义了Mainactivity所用到的回调

public interface Callback {

/**

* @param resultCode 请求结果返回的标识码

* @param bitmap Model层数据中Bitmap对象,用户Control刷新View

*/

void callback(int resultCode, ImageBean bitmap);

}

ImageDownloader图片下载业务类,作用是为了抽离具体的业务逻辑,避免全部写在Activity中

public class ImageDownloader {

static final int SUCCESS = 200;

static final int ERROR = 401;

/**

* 下载图片

*

* @param callback

* @param imageBean

*/

public static void down(Callback callback, ImageBean imageBean) {

new Thread(new Downloader(callback, imageBean)).start();

}

static final class Downloader implements Runnable {

private final Callback callback;

private final ImageBean imageBean;

public Downloader(Callback callback, ImageBean imageBean) {

this.callback = callback;

this.imageBean = imageBean;

}

@Override

public void run() {

try {

URL url = new URL(imageBean.getRequestPath());

HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();

httpURLConnection.setConnectTimeout(5000);

httpURLConnection.setRequestMethod("GET");

if (httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {

InputStream inputStream = httpURLConnection.getInputStream();

Bitmap bitmap = BitmapFactory.decodeStream(inputStream);

showUI(SUCCESS, bitmap);

} else {

showUI(ERROR, null);

}

} catch (Exception e) {

e.printStackTrace();

showUI(ERROR, null);

}

}

private void showUI(int resultCode, Bitmap bitmap) {

if (callback != null) {

imageBean.setBitmap(bitmap);

callback.callback(resultCode, imageBean);

}

}

}

}

通过如上就能清晰的了解到MVC的具体划分,其实在AS创建一个Activity时,就会创建好Controller和View。

MVC架构存在的固有缺陷---内存泄漏

其实就MVC使用而言成本是比较低的,开发速度又快不必像MVP需要定义好协议层,View的回调等,那为什么很多比较大型的项目会选用MVP或者MVVM等架构呢,因为MVC很难避免存在内存泄漏的问题

举个栗子

Activity中存在耗时操作,比如请求网络或者本地数据库等耗时操作并开启了子线程,用户按下返回键或者Home键清除APP进程,当前Activity执行了onDestroy回调进行了销毁。但是他的子线程并未销毁也就存在了内存泄漏的情况,如下我在主线程开启一个线程然后再Finish掉Activity分析一下资源内存回收情况

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

imageView = findViewById(R.id.iv_picture);

new Thread(new Runnable() {

@Override

public void run() {

SystemClock.sleep(50000);

}

}).start();

}

1e2adb415f27

image.png

在Profiler中可以看到,当finish掉当前Activity时,Mainactivity内存中仍然存在一个线程和一个回调没有得到回收,这也就造成了MVC框架存在了内存泄漏的缺陷,所以在使用MVC开发项目尤其要注意网络请求Handler等耗时操作在onDestroy时的cancel和clear,尽可能的减少内存溢出出现的频率

MVC架构设计·源码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然,我可以给你一个简单的 Android MVC 架构的示例。下面是一个基本的 MVC 架构示例代码: 首先,创建一个名为 `User` 的模型类,表示用户信息: ```java public class User { private String name; private String email; public User(String name, String email) { this.name = name; this.email = email; } // getter 和 setter 方法 } ``` 接下来,创建一个名为 `UserController` 的控制器类,用于处理用户数据和业务逻辑: ```java public class UserController { private User user; public UserController() { // 初始化用户数据 user = new User("John Doe", "johndoe@example.com"); } public User getUser() { return user; } // 其他业务逻辑处理方法 } ``` 然后,创建一个名为 `MainActivity` 的 Activity 类,作为视图层,并与控制器进行交互: ```java public class MainActivity extends AppCompatActivity { private UserController userController; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化控制器 userController = new UserController(); // 获取用户数据并更新 UI User user = userController.getUser(); TextView nameTextView = findViewById(R.id.nameTextView); TextView emailTextView = findViewById(R.id.emailTextView); nameTextView.setText(user.getName()); emailTextView.setText(user.getEmail()); } // 其他交互逻辑处理方法 } ``` 最后,在布局文件 `activity_main.xml` 中添加 TextView 控件用于显示用户信息: ```xml <LinearLayout> <TextView android:id="@+id/nameTextView" android:layout_width="match_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/emailTextView" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> ``` 这个示例展示了一个简单的 Android MVC 架构,其中控制器负责处理数据和业务逻辑,视图层负责显示数据。通过控制器获取数据并更新 UI,实现了模型和视图的分离。然而,MVC 架构在大型应用中可能会导致代码变得复杂难以维护,因此在实践中,你可能需要结合其他模式或框架来更好地组织和管理代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值