readhub项目kotlin版开发指南(mvp架构)(代码片段)

lijianming180 lijianming180     2023-04-23     529

关键词:

ReadHub项目Kotlin版转换指南(一、环境搭建)

ReadHub项目Kotlin版转换指南(二、数据库和网络请求)

ReadHub项目Kotlin版转换指南(三、MVP架构)

Android 开发中的 MVP 架构相信大家都已经熟悉,不熟悉的请右转 Google,ReadHub 项目从 Java 转换成 Kotlin 过程中,我们需要一套新的架构方式来实现(Kotlin 项目中没有使用 dagger2)。

base 为 MVP 架构的基础部分,user 为其具体使用过程。

base

BaseContract

interface BaseContract 
    interface IView 
        fun showLoading()
        fun hideLoading()
    

    interface IPresenter<V : IView> 
        fun getView(): V
    

BaseContract 中定义了两个接口 IViewIPresenter

IView 接口中定义了 Loading 的操作,使其可以在每个 View 中使用,如果你的项目中有一些需要在大多数 View 中用到的函数,也可定义在此接口中。

IPresenter 中声明一个泛型 V 继承自 IView,通过 getView 函数可以获取到该变量,用来回调 Model 中的结果给 View

BaseActivity && BaseFragment

abstract class BaseActivity<P : BaseContract.IPresenter<*>> : AppCompatActivity(), BaseContract.IView 
    private var mKProgressHUD: KProgressHUD? = null
    protected lateinit var mPresenter: P

    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)

        val layoutId = getLayoutId()
        setContentView(layoutId)
        initView()
        initData()
    

    protected abstract fun getLayoutId(): Int
    protected abstract fun initView()
    protected abstract fun initData()

    override fun showLoading() 
        mKProgressHUD = KProgressHUD.create(this)
        mKProgressHUD?.setStyle(KProgressHUD.Style.SPIN_INDETERMINATE)
                ?.setCancellable(true)
                ?.setAnimationSpeed(2)
                ?.setDimAmount(0.5f)
                ?.show()
    

    override fun hideLoading() 
        mKProgressHUD?.dismiss()
    

abstract class BaseFragment<P : BaseContract.IPresenter<*>> : Fragment(), BaseContract.IView 
    private var mRootView: View? = null
    private var mKProgressHUD: KProgressHUD? = null
    protected lateinit var mPresenter: P

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? 
        inflaterView(inflater, container)
        return mRootView
    

    override fun onActivityCreated(savedInstanceState: Bundle?) 
        super.onActivityCreated(savedInstanceState)
        initView(mRootView)
        initData大专栏  ReadHub项目Kotlin版开发指南(三、MVP架构)n class="p">()
    

    /**
     * 设置View
     *
     * @param inflater
     * @param container
     */
    private fun inflaterView(inflater: LayoutInflater, @Nullable container: ViewGroup?) 
        if (mRootView == null) 
            mRootView = inflater.inflate(getLayoutId(), null)
        
    

    protected abstract fun getLayoutId(): Int
    protected abstract fun initView(view: View?)
    protected abstract fun initData()

    override fun showLoading() 
        mKProgressHUD = KProgressHUD.create(activity)
        mKProgressHUD?.setStyle(KProgressHUD.Style.SPIN_INDETERMINATE)
                ?.setCancellable(true)
                ?.setAnimationSpeed(2)
                ?.setDimAmount(0.5f)
                ?.show()
    

    override fun hideLoading() 
        mKProgressHUD?.dismiss()
    

BaseActivity 中声明泛型 P 继承自 BaseContract.IPresenter,变量 mPresenter 声明类型 P 并且延迟初始化(在子类中初始化)。

BaseActivity 继承 BaseContract.IView,重写回调方法,如 hideLoading、showLoading

news

NewsContract

interface NewsContract 
    interface View : BaseContract.IView 
        fun updateTechNews(publishDate: String, newsMos: ArrayList<NewsMo>)
    

    interface Presenter : BaseContract.IPresenter<View> 
        fun getTechNews(publishDate: String)
    

NewsPresenter

class NewsPresenter(var mView: BaseContract.IView) : NewsContract.Presenter 
    override fun getView(): NewsContract.View 
        return mView as NewsContract.View
    

    override fun getTechNews(publishDate: String) 
        LogUtils.i("apiTachNews === ")
        App.sInstance.apiService(ReadhubApiService::class.java)
                ?.apiTeachNews(publishDate, Constant.NEWS_PAGE_SIZE)
                ?.compose(RxSchedulers.io_main())
                ?.subscribe( 
                    getView()?.updateTechNews(publishDate, it.data!!)
                , 
                    LogUtils.e("apiTeachNews error == $it")
                )

    

getView 获取 IView 对象的实现。

NewsFragment

class NewsFragment : BaseFragment<NewsPresenter>(), NewsContract.View 
    override fun getLayoutId(): Int 
        return R.layout.fragment_news
    

    override fun initView(view: View?) 
    

    override fun initData() 
        mPresenter = NewsPresenter(this)
        mPresenter?.getTechNews("")
    

    override fun updateTechNews(publishDate: String, newsMos: ArrayList<NewsMo>) 

构造 mPresenter 对象,获取 Model 中的数据。

kotlin版天气客户端

...RxJava`+`Retrofit`+`EventBus`等架构设计的项目,项目代码结构清晰并且有详 查看详情

kotlin版天气客户端

...RxJava`+`Retrofit`+`EventBus`等架构设计的项目,项目代码结构清晰并且有详细注释。API和风天气开放APIDemo Demo点击项目截图   主要功能根据高德获取当前城市,区域。首页。获取指定城市的实时天气信... 查看详情

android低功耗蓝牙开发(扫描连接数据交互)kotlin版(代码片段)

...f08;扫描、连接、数据交互)Kotlin版前言正文一、配置项目二、页面设计三、扫描设备①绑定视图②检查Android版本③打开蓝牙④请求权限⑤扫描结果⑥设备适配器编写⑦数据渲染⑧开始和停止扫描四、连接和数据交互①绑定... 查看详情

android查询天气demo,基于mvp+kotlin+rxjava2+room+retrofit2

前言本文用于记录整个demo学习、开发的过程一、keypoint  1.使用主流框架:mvp+kotlin+rxjava2+room+retrofit2    2.简结的ui/ux   3.第三方api的使用  https://www.sojson.com/blog/305.html   4.定期自动更新天气数据  查看详情

全新升级kotlin系统入门与进阶

...主要介绍什么是Kotlin,课程安排,以及开发环境的配置。项目实战移步-->《Kotlin打造完整电商APP模块化+MVP+主流框架》:http://coding.imooc.com/class/166.html1-1课程导学1-2什么是Kotlin?第2章数据类型(难度系数:☆)本章主要讲解Kotl... 查看详情

android低功耗蓝牙开发(扫描连接数据交互)kotlin版(代码片段)

...f08;扫描、连接、数据交互)Kotlin版前言正文一、配置项目二、页面设计三、扫描设备①绑定视图②检查Android版本③打开蓝牙④请求权限⑤扫描结果⑥设备适配器编写⑦数据渲染⑧开始和停止扫描四、连接和数据交互①绑定... 查看详情

javascript设计模式读书笔记=;架构型设计模式,mvc,mvp,mvvm

全系列目录JavaScript设计模式读书笔记(一)=>创建型设计模式JavaScript设计模式读书笔记(二)=>结构型设计模式JavaScript设计模式读书笔记(三)=>行为型设计模式JavaScript设计模式读书笔记&#... 查看详情

如何使用 Cocoapods 调整 Kotlin Multiplatform 项目的 Swift 类名?

】如何使用Cocoapods调整KotlinMultiplatform项目的Swift类名?【英文标题】:HowtoadjustSwiftclassnamesforKotlinMultiplatformprojectwithCocoapods?【发布时间】:2019-11-2718:59:36【问题描述】:在我的Kotlin多平台项目中,我大量使用命名空间。另外,由... 查看详情

纯kotlin+viewmodel+livedata+协程mvvm

...符等等各种混用,甚至还有把mvp的presenter当vm使用的,有的项目混用的多了看起来真的很不直观,没法用到实际项目中。那就自己写一个简单的纯净版mvvm,不用jetpack、databinding、rxjava、晦涩的操作符等。同时也练习一下kotlin各种... 查看详情

基于mvp模式实现四则运算器

基于MVP模式四则运算器 来到新东家,项目的框架采用的是MVP模式,刚来公司的时候,项目经理给予分配小任务,首先熟悉MVP模式,而后普通的四则运算器的实现使用MVP分层。这里主要回顾当时做任务时候的对于MVP模式的理解... 查看详情

04kotlin登录功能mvp基类封装(代码片段)

(1)一个人只要自己不放弃自己,整个世界也不会放弃你.(2)天生我才必有大用(3)不能忍受学习之苦就一定要忍受生活之苦,这是多么痛苦而深刻的领悟.(4)做难事必有所得(5... 查看详情

idea创建kotlin项目(代码片段)

今天新建了一个kotlin项目,竟然不能导入jar包,原因是新建项目的时候,选择了kotlin作为Gradle的开发语音,kotlin语音里面,下面这行配置识别不了:implementationfileTree(dir:'libs',include:['*.jar'])所以&... 查看详情

建造者模式(java与kotlin版)

...作Kotlin入门第三课:数据类型初次尝试用Kotlin实现Android项目 1.定义建造者模式(BuilderPattern):将一个 查看详情

快速开发的项目壳,kotlin语言开发(代码片段)

MvvmHelper项目地址:hegaojian/MvvmHelper 简介::chicken::basketball:这是一个快速开发的项目壳,Kotlin语言开发,MVVM+Jetpack架构,封装了公共头部、界面状态管理、ViewModel、LiveData、DataBinding、头部刷新、加载更多、... 查看详情

1.0项目mvp阶段时间规划和里程碑规划

本文在研发组织管理中的位置:研发组织管理--项目管理--1.0项目MVP阶段时间规划和里程碑规划环节启动阶段开发测试阶段上线阶段项目启动会需求讲解会需求确认架构设计评审业务领域评审核心初版开发(core迭代,... 查看详情

抽象工厂模式(java与kotlin版)

...作Kotlin入门第三课:数据类型初次尝试用Kotlin实现Android项目 1.定义抽象工厂模式(AbstractFactoryPattern):提供一个创建一系列相关或相互 查看详情

安卓实践开发之mvp一步步实现到高级封装

...喜欢自己的mvc,不喜欢看见mvp庞大的架构,所以前公司的项目呢也不曾使用过mvp(同事也不接受这种模式),毕竟项目架构不是特别复杂的话使用m 查看详情

idea创建java项目时只有groovy,koylin/jvm,kotlin/js三个选项怎么解决

...吧。参考技术A下面是库,用不上就不用选,左侧可以先项目类型,如maven 查看详情