MVC架构

2019-12-16  本文已影响0人  migill

MVC流程关系:


  • View接收到用户的操作
  • View将用户的操作,交给Controller。
  • Controller完成具体业务逻辑。
  • 得到结果封装Model,在进行View更新。
    如图可以看出Controller是作为一个媒介,处于Model和View之间,Model和View之间有紧密的联系,耦合性偏强

三层模型在Android中的体现

我们通过一个例子,看看MVC的使用和有什么缺点。
描述: 点击下载图片按钮,开启下载图片任务,下载结束后进行显示


View检测到事件后,告诉Controller去下载图片,图片下载成功后,跟新Model数据。并把model中的数据在View中显示。

//model层
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;
    }
}
public interface Callback {

    /**
     * @param resultCode 请求结果返回标识码
     * @param imageBean Model层数据中bitmap对象(用于C层刷新V)
     */
    void callback(int resultCode, ImageBean imageBean);
}
public class ImageDownloader {

    // 成功
    static final int SUCCESS = 200;

    // 失败
    static final int ERROR = 404;

    public 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);
            }
        }
    }
}
//Controller层
public class MainActivity extends AppCompatActivity implements Callback {

    private ImageView imageView;
    private final static String PATH = "下载的图片";
    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_image);
    }

    // 点击事件
    public void getImage(View view) {
        ImageBean imageBean = new ImageBean();
        imageBean.setRequestPath(PATH);
        new ImageDownloader().down(this, imageBean);
    }

    @Override
    public void callback(int resultCode, ImageBean imageBean) {
        Message message = handler.obtainMessage(resultCode);
        message.obj = imageBean.getBitmap();
        handler.sendMessageDelayed(message, 500);
    }
}

思考:如果在MainActivity下载图片的过程中,我们按了返回键,退出了应用,那么这个MainActivity有没有被回收呢?

如下图,可以看出发生了内存泄漏。由此可见MVC架构的一个缺点就是容易发生内存泄漏

上一篇下一篇

猜你喜欢

热点阅读