当前位置:嗨网首页>书籍在线阅读

11-基础类封装

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

18.4.1 基础类封装

封装,即隐藏对象的属性和实现细节,仅对外公开接口。作为面向接口编程的重要特性,合理地使用封装不仅可以增强代码的安全性,还可以优化代码结构、简化编程。

在Android项目开发中,为了简化编程并优化代码层次,经常需要对具有相同或相似功能的代码进行封装并最终达到将公共的部分封装起来、不同的部分交由子类实现的目的。例如,下面是本视频应用Fragment基础页面的基础类BaseFragment的代码。

abstract class BaseFragment: Fragment() {
    private var isViewCreated = false
    private var isDataLoaded = false
    //页面底图
    protected var mMultipleStatusView: MultipleStatusView? = null
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater?.inflate(getLayoutId(),null)
    }
    override fun setUserVisibleHint(isVisibleToUser: Boolean) {
        super.setUserVisibleHint(isVisibleToUser)
        if (isVisibleToUser) {
            lazyLoadDataIfPrepared()
        }
    }
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        isViewCreated = true
        initView()
        lazyLoadDataIfPrepared()
        mMultipleStatusView?.setOnClickListener(mRetryClickListener)
    }
    private fun lazyLoadDataIfPrepared() {
        if (userVisibleHint && isViewCreated && !isDataLoaded) {
            lazyLoad()
            isDataLoaded = true
        }
    }
    open val mRetryClickListener: View.OnClickListener = View.OnClickListener {
        lazyLoad()
    }
    //获取视图
    abstract fun getLayoutId():Int
    //初始化视图
    abstract fun initView()
    // Fragment懒加载,数据处理
    abstract fun lazyLoad()
}

具体使用的时候我们只需要继承BaseFragment并实现abstract函数即可。除此之外,Presenter作为View和Model沟通的桥梁,可以将View的绑定和解绑以及数据沟通操作封装在该层。

open class BasePresenter<T : IBaseView> : IPresenter<T> {
    var mRootView: T? = null
        private set
    private var compositeDisposable = CompositeDisposable()
    /**
     * 绑定视图
     */
    override fun attachView(mRootView: T) {
        this.mRootView = mRootView
    }
    /**
     * 解绑视图
     */
    override fun detachView() {
        mRootView = null
        if (!compositeDisposable.isDisposed) {
            compositeDisposable.clear()
        }
    }
    private val isViewAttached: Boolean
        get() = mRootView != null
    fun checkViewAttached() {
        if (!isViewAttached) throw ViewNotAttachedException()
    }
    fun addSubscription(disposable: Disposable) {
        compositeDisposable.add(disposable)
    }
    private class ViewNotAttachedException internal constructor() : RuntimeException ("请先调用attachView()绑定视图")
}

可以发现,BasePresenter的内容是比较简单的,该类的主要作用是绑定或解绑View,因此在其子类中只需要实现BasePresenter抽象类,即可与View层发生联系,进而将MVC模式中View层的逻辑代码交由Presenter处理。