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 中的数据。

ReadHub项目Kotlin版开发指南(三、MVP架构)的更多相关文章

  1. HelloX项目github协同开发指南

    概述 为了提高协同开发效率,HelloX项目已托管到github网站上.根据目前的开发进展,创建了下列几个子项目: HelloX操作系统内核项目:https://github.com/hellox-p ...

  2. 转:Android开发中的MVP架构(最后链接资源不错)

    Android开发中的MVP架构 最近越来越多的人开始谈论架构.我周围的同事和工程师也是如此.尽管我还不是特别深入理解MVP和DDD,但是我们的新项目还是决定通过MVP来构建. 这篇文章是我通过研究和 ...

  3. 转: Android开发中的MVP架构详解(附加链接比较不错)

    转: http://www.codeceo.com/article/android-mvp-artch.html 最近越来越多的人开始谈论架构.我周围的同事和工程师也是如此.尽管我还不是特别深入理解M ...

  4. 设计模式笔记之二:Android开发中的MVP架构(转)

    写在前面,本博客来源于公众号文章:http://mp.weixin.qq.com/s?__biz=MzA3MDMyMjkzNg==&mid=402435540&idx=1&sn ...

  5. kotlin 语言入门指南(三)--编码习惯

    这章主要讲当前 kotlin 的一些编码习惯. 命名 如无疑问,kotlin 的命名风格与以下的java风格一样: --驼峰命名法(不要使用下划线) --类名首字母大写 --方法和属性名首字母小写 - ...

  6. 【Android】家庭记账本手机版开发报告三

    一.说在前面 昨天 对第一天的框架结构进行了四方面的完善 今天 对界面显示和逻辑结构进行完善 问题 无 二.界面展示完善 1.使用可回收的列表recyclerView展示账单的信息,并设置数据项为卡片 ...

  7. 腾讯云TDSQL MySQL版 - 开发指南 二级分区

    TDSQL MySQL版 目前支持 Range 和 List 两种格式的二级分区,具体建表语法和 MySQL 分区语法类似. 二级分区语法 一级 Hash,二级 List 分区示例如下: MySQL ...

  8. 腾讯云TDSQL MySQL版 - 开发指南 分布式事务

    由于事务操作的数据通常跨多个物理节点,在分布式数据库中,类似方案即称为分布式事务. TDSQL MySQL版 支持普通分布式事务协议和 XA 分布式事务协议.TDSQL MySQL版(内核5.7或以上 ...

  9. 《iOS开发指南:从零基础到App Store上架(第2版)》

    <iOS开发指南:从零基础到App Store上架(第2版)> 基本信息 作者: 关东升 丛书名: 图灵原创 出版社:人民邮电出版社 ISBN:9787115348029 上架时间:201 ...

随机推荐

  1. XSL使用写法与效果

    data.xml <?xml-stylesheet type="text/xsl" href="getdata.xsl"?> <ROOT> ...

  2. YOLO配置文件理解

    [net] batch=64 每batch个样本更新一次参数. subdivisions=8 如果内存不够大,将batch分割为subdivisions个子batch,每个子batch的大小为batc ...

  3. 扯下Python的super()

    注: Python 2.7.x 环境下 今晚搜东西无意中看到这篇Understanding Python super() with __init__() methods. 其实这篇老早就看过了, 不过 ...

  4. BTree

    hash.平衡二叉树.BTree.B+tree的区别 https://blog.csdn.net/qq_40673786/article/details/90082444 联合索引在B+树上的结构介绍 ...

  5. Django与AJAX-choice字段-MTV和MVC模型-sweetalert搭建页面

    Django中的choice字段 应用的场景: 用户信息举列:如用户性别.婚否.学历.工作状态等可以列举出来供选择的信息 书写models创建表模型: 数据的获取和查询: 总结: "&quo ...

  6. 基于Dijsktra算法的最短路径求解

    基于Dijsktra算法的最短路径求解   描述 一张地图包括n个城市,假设城市间有m条路径(有向图),每条路径的长度已知.给定地图的一个起点城市和终点城市,利用Dijsktra算法求出起点到终点之间 ...

  7. LeetCode No.127,128,129

    No.127 LadderLength 单词接龙 题目 给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度.转换需遵 ...

  8. FaceIDViewer.rar

    FaceIDViewer用于查看Office工具栏控件的内置图标编号. 压缩包中包含4个文件,打开任何一个都可以进行查询.其中带有V2字样的文件,已经排除掉了空白图标. Excel版动态图: Word ...

  9. conditon 实现等待/通知

    synchronized 与wait() 和notify() notifyAll() 方法相结合可以实现等待 通知 ReetrantLock也可以实现同样的功能 需要借助condition对象,一个l ...

  10. php mb_substr()函数的详细解释!

    PHP substr()函数可以分割文字,但要分割的文字如果包括中文字符往往会遇到问题,这时可以用mb_substr()/mb_strcut这个函数,mb_substr() /mb_strcut的用法 ...