MVP思想精髓与解耦(Kotlin)

本文介绍了MVP(Model-View-Presenter)项目结构,强调了其在Android开发中的应用,通过一个Demo展示了MVP的思想精髓。在Demo中,详细解释了各组件的角色和交互,包括View、Presenter和Model如何协同工作以实现用户操作与数据处理的解耦。同时,提到了内存泄漏等注意事项将在后续文章中补充。
摘要由CSDN通过智能技术生成

本文用来认识MVP项目结构,第二篇会补充处理内存泄漏等注意点。

理论知识,吧啦吧啦~,没兴趣可以直接 跳至Demo部分

MVP初探

关系:
View收到用户的操作
View把用户的操作,交给Presenter
Presenter控制Model进行业务逻辑处理
Presenter处理完毕后,数据封装到Model
Presenter收到通知后,再更新View方式:是双向的通信方式
优点:
View层与Model层完全分离
所有的逻辑交互都在Presenter
MVP分层较为严谨

MVP思想精髓

View层只需面向Presenter层,不需要知道Model层;
Model层只需面向Presenter层,不需要知道View层;
View层和Model层逻辑交互在Presenter。

Demo目录
在这里插入图片描述

DownloadLoaderEngine.kt

// View层交互,Model层交互共同的需求(契约、合同)
interface DownloaderContract {
    interface M {
        // P层告诉M层,需要做什么事情
        fun requestDownloader(imageBean: ImageBean)
    }

    interface PV {
        // V层告诉P层,需要做什么事情
        fun requestDownloader(imageBean: ImageBean)

        // P层得到M层的结果返回,再通知V层
        fun responseDownloaderResult(isSuccess: Boolean, imageBean: ImageBean)
    }
}

ImageBean.kt

data class ImageBean(
    var requestPath: String,// 网络图片请求地址
    var bitmap: Bitmap?// 结果返回bitmap对象
)

DownloadPresenter.kt

// P层几乎不做事情?谷歌的sample中,P层是包揽了所有的活
class DownloadPresenter(var view: MainActivity) : DownloaderContract.PV{

    private var model: DownloadLoaderEngine = DownloadLoaderEngine(this)// 下载的模型

    override fun requestDownloader(imageBean: ImageBean) {
        // 接收到View层的指令,去完成某个需求(可以自己完成,也可以让别人去完成)
        model.requestDownloader(imageBean)
    }

    override fun responseDownloaderResult(isSuccess: Boolean, imageBean: ImageBean) {
        // 将完成的结果告知View层(刷新UI)

        // 将完成的结果告知View层(刷新UI)
        view.runOnUiThread { view.responseDownloaderResult(isSuccess, imageBean) }
    }

}

DownloadLoaderEngine.kt

class DownloadLoaderEngine(val presenter: DownloadPresenter) : DownloaderContract.M{

    override fun requestDownloader(imageBean: ImageBean) {
        // P层让我做这个需求
        Thread(DownLoader(imageBean)).start()
    }

    inner class DownLoader(private val imageBean: ImageBean) : Runnable {
        override fun run() {
            try {
                val url = URL(imageBean.requestPath)
                val httpURLConnection = url.openConnection() as HttpURLConnection
                httpURLConnection.connectTimeout = 5000
                httpURLConnection.requestMethod = "GET"
                if (httpURLConnection.responseCode == HttpURLConnection.HTTP_OK) {
                    val inputStream = httpURLConnection.inputStream
                    val bitmap = BitmapFactory.decodeStream(inputStream)
                    showUi(Constant.SUCCESS, bitmap)
                } else {
                    showUi(Constant.ERROR, null)
                }
            } catch (e: Exception) {
                e.printStackTrace()
                showUi(Constant.ERROR, null)
            }
        }

        private fun showUi(resultCode: Int, bitmap: Bitmap?) {
            imageBean.bitmap = bitmap
            presenter.responseDownloaderResult(resultCode == Constant.SUCCESS, imageBean)
        }
    }
}

MainActivity.kt

// MVC中Activity是C层,MVP中Activity是V层
class MainActivity : AppCompatActivity(), DownloaderContract.PV{

    private lateinit var imageView: ImageView
    private val presenter: DownloadPresenter = DownloadPresenter(this)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        imageView = findViewById(R.id.iv);
    }

    override fun requestDownloader(imageBean: ImageBean) {
        presenter.requestDownloader(imageBean)
    }

    override fun responseDownloaderResult(isSuccess: Boolean, imageBean: ImageBean) {
        Toast.makeText(this, if (isSuccess) "下载成功" else "下载失败", Toast.LENGTH_SHORT).show()
        if (isSuccess && imageBean.bitmap != null) {
            imageView.setImageBitmap(imageBean.bitmap)
        }
    }


    // 点击事件
    fun down(view: View?) {
        val imageBean = ImageBean("", null)
        imageBean.requestPath = Constant.IMAGE_PATH
        requestDownloader(imageBean)
    }
}

Constant.kt

object Constant {
    // 网络图片地址
    const val IMAGE_PATH =
        "https://bkimg.cdn.bcebos.com/pic/b3119313b07eca80653838478b6880dda144ad342572?x-bce-process=image/resize,m_lfit,h_500,limit_1/format,f_auto"

    // 成功
    const val SUCCESS = 200

    // 失败
    const val ERROR = 404
}

最终效果

在这里插入图片描述
Demo源码下载


MVP思想精髓与解耦(Kotlin)
MVP思想实现项目基础框架搭建

架构师系列文章一览

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT小瓯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值