ReadHub项目Kotlin版开发指南(三、MVP架构)
ReadHub项目Kotlin版转换指南(二、数据库和网络请求)
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
中定义了两个接口 IView
和 IPresenter
,
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架构)的更多相关文章
- HelloX项目github协同开发指南
概述 为了提高协同开发效率,HelloX项目已托管到github网站上.根据目前的开发进展,创建了下列几个子项目: HelloX操作系统内核项目:https://github.com/hellox-p ...
- 转:Android开发中的MVP架构(最后链接资源不错)
Android开发中的MVP架构 最近越来越多的人开始谈论架构.我周围的同事和工程师也是如此.尽管我还不是特别深入理解MVP和DDD,但是我们的新项目还是决定通过MVP来构建. 这篇文章是我通过研究和 ...
- 转: Android开发中的MVP架构详解(附加链接比较不错)
转: http://www.codeceo.com/article/android-mvp-artch.html 最近越来越多的人开始谈论架构.我周围的同事和工程师也是如此.尽管我还不是特别深入理解M ...
- 设计模式笔记之二:Android开发中的MVP架构(转)
写在前面,本博客来源于公众号文章:http://mp.weixin.qq.com/s?__biz=MzA3MDMyMjkzNg==&mid=402435540&idx=1&sn ...
- kotlin 语言入门指南(三)--编码习惯
这章主要讲当前 kotlin 的一些编码习惯. 命名 如无疑问,kotlin 的命名风格与以下的java风格一样: --驼峰命名法(不要使用下划线) --类名首字母大写 --方法和属性名首字母小写 - ...
- 【Android】家庭记账本手机版开发报告三
一.说在前面 昨天 对第一天的框架结构进行了四方面的完善 今天 对界面显示和逻辑结构进行完善 问题 无 二.界面展示完善 1.使用可回收的列表recyclerView展示账单的信息,并设置数据项为卡片 ...
- 腾讯云TDSQL MySQL版 - 开发指南 二级分区
TDSQL MySQL版 目前支持 Range 和 List 两种格式的二级分区,具体建表语法和 MySQL 分区语法类似. 二级分区语法 一级 Hash,二级 List 分区示例如下: MySQL ...
- 腾讯云TDSQL MySQL版 - 开发指南 分布式事务
由于事务操作的数据通常跨多个物理节点,在分布式数据库中,类似方案即称为分布式事务. TDSQL MySQL版 支持普通分布式事务协议和 XA 分布式事务协议.TDSQL MySQL版(内核5.7或以上 ...
- 《iOS开发指南:从零基础到App Store上架(第2版)》
<iOS开发指南:从零基础到App Store上架(第2版)> 基本信息 作者: 关东升 丛书名: 图灵原创 出版社:人民邮电出版社 ISBN:9787115348029 上架时间:201 ...
随机推荐
- XSL使用写法与效果
data.xml <?xml-stylesheet type="text/xsl" href="getdata.xsl"?> <ROOT> ...
- YOLO配置文件理解
[net] batch=64 每batch个样本更新一次参数. subdivisions=8 如果内存不够大,将batch分割为subdivisions个子batch,每个子batch的大小为batc ...
- 扯下Python的super()
注: Python 2.7.x 环境下 今晚搜东西无意中看到这篇Understanding Python super() with __init__() methods. 其实这篇老早就看过了, 不过 ...
- BTree
hash.平衡二叉树.BTree.B+tree的区别 https://blog.csdn.net/qq_40673786/article/details/90082444 联合索引在B+树上的结构介绍 ...
- Django与AJAX-choice字段-MTV和MVC模型-sweetalert搭建页面
Django中的choice字段 应用的场景: 用户信息举列:如用户性别.婚否.学历.工作状态等可以列举出来供选择的信息 书写models创建表模型: 数据的获取和查询: 总结: "&quo ...
- 基于Dijsktra算法的最短路径求解
基于Dijsktra算法的最短路径求解 描述 一张地图包括n个城市,假设城市间有m条路径(有向图),每条路径的长度已知.给定地图的一个起点城市和终点城市,利用Dijsktra算法求出起点到终点之间 ...
- LeetCode No.127,128,129
No.127 LadderLength 单词接龙 题目 给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度.转换需遵 ...
- FaceIDViewer.rar
FaceIDViewer用于查看Office工具栏控件的内置图标编号. 压缩包中包含4个文件,打开任何一个都可以进行查询.其中带有V2字样的文件,已经排除掉了空白图标. Excel版动态图: Word ...
- conditon 实现等待/通知
synchronized 与wait() 和notify() notifyAll() 方法相结合可以实现等待 通知 ReetrantLock也可以实现同样的功能 需要借助condition对象,一个l ...
- php mb_substr()函数的详细解释!
PHP substr()函数可以分割文字,但要分割的文字如果包括中文字符往往会遇到问题,这时可以用mb_substr()/mb_strcut这个函数,mb_substr() /mb_strcut的用法 ...