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 ...
随机推荐
- python中__call__方法
在 Python 中提供了__call__ 方法,允许创建可调用的对象(实例).如果类中实现了 __call__ 方法,则可以像使用函数一样使用类. 例如简单的封装一个接口 get/post 方法: ...
- 9)用request方式
一个带有html的代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http: ...
- sha1和md5的区别
Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入,变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射,也就是,散列值的空 ...
- Matlab高级教程_第二篇:Matlab相见恨晚的模块_02_并行运算-2
1 MATLAB并行计算-从个人桌面到远程集群和云(陈伟/魏奋)视频摘录笔记 https://cn.mathworks.com/videos/parallel-computing-with-matla ...
- 七、linux-mysql下mysql增量备份与恢复
1.备份的意义 运维工作:保护公司的数据 . 网站7*24小时服务 但相当来说,数据更加重要,而数据最核心的就是数据库数据,所以数据库的备份和恢复就显得十分重要. 2.备份的几个参数 mys ...
- 三十五、lamp经典组合搭建
一.安装mysql数据库 1.1 创建组和用户: 1)groupadd mysql 2)useradd mysql -g mysql -M -s /sbin/nologin 3)config ...
- Maven 仓库搜索服务和私服搭建
Maven 仓库搜索服务 使用maven进行日常开发的时候,一个常见问题就是如何寻找需要的依赖,我们可能只知道需要使用类库的项目名称,但是添加maven依赖要求提供确切的maven坐标,这时就可以使用 ...
- 20)PHP,数组的遍历
然后开始使用这2个函数和while循环结构来实现数组遍历: 形式: reset($arr1); while ( list ($key, $value ) = each( $arr1) ) //从数组$ ...
- AdminWebSessionManager AdminAuthorizingRealm ShiroConfig ShiroExceptionHandler
package org.linlinjava.litemall.admin.shiro; import com.alibaba.druid.util.StringUtils; import org.a ...
- 在windows系统下安装使用msf
前沿 msf基本是我在kali里最经使用的工具了 因为今天碰到一些关于VmWare的事情没有解决 windows在前一段时间更新,要求我卸载vmware虚拟机,否则就无法更新. 卸载之后再装回来就无法 ...