阅读 301

用RxJava+Retrofit+OKHttp封装的一个Kotlin版本的MVP框架

kotlin-mvp

技术要点

1. RxJava+Retrofit+OkHttp实现链式http请求

2. 封装基类:BaseActivity、BasePresenterActivity、BaseFragment、BasePresenterFragment、RecycleAdapter、BasePresenter

3. 封装工具扩展类:CalendarExt、ContextExt、DateExt、EditTextExt、GsonExt、RxJavaExt、StringExt

4. 引入LifeCycle,将Presenter和Activity的生命周期绑定在一起

5. 将在Application中初始化移至到ContentProvider中,从而不用封装BaseApplication

6. AOP(面向切面)封装注解:TimeLog、ClickGap

7. APT(编译时注解)封装注解:OnClickFirstDrawable、OnClickFirstText、OnClickSecondDrawable、OnClickSecondText、Prefs、PrefsField、StatusBar

8. Dagger2对类的生命周期做一个管理

最低兼容:19

Gradle

1. 在Project的build.gradle中添加

allprojects {
     repositories {
 	    maven { url 'https://jitpack.io' }
     }
 }
复制代码

2. AspectJX的使用请参考官方文档

dependencies {
    classpath 'com.github.franticn:gradle_plugin_android_aspectjx:2.0.6'
}
复制代码

3. 在app的build.gradle的添加

apply plugin: 'kotlin-kapt' // 使用 kapt 注解处理工具

apply plugin: 'android-aspectjx'
复制代码

4. 添加依赖

implementation "com.github.catch-pig.kotlin-mvp:mvp:last_version"
kapt "com.github.catch-pig.kotlin-mvp:compiler:last_version"
kapt "com.google.dagger:dagger-compiler:2.23.2"
kapt "com.google.dagger:dagger-android-processor:2.23.2"
复制代码

使用

1. 在需要使用状态栏、标题栏、加载动画的主题中配置全局参数:

属性 类型 必须 默认 说明
title_bar_back_icon DrawableRes 标题栏的返回图标
title_bar_background ColorRes 标题栏的背景色
title_bar_text_color ColorRes 标题栏的文字颜色
title_bar_show_line boolean false 标题栏的下方的线条是否显示
loading_view_color ColorRes loading动画颜色
loading_view_background ColorRes loading动画背景色
recycle_view_empty_layout LayoutRes emptyLayout 列表空页面

使用示例:

```
<style name="AppThemeBarStyle" parent="Theme.AppCompat.Light.NoActionBar">
    <!--全局标题栏和状态栏配置-->
    <item name="title_bar_background">@color/colorPrimary</item>
    <item name="title_bar_back_icon">@drawable/back</item>
    <item name="title_bar_text_color">@color/white</item>
    <item name="title_bar_show_line">false</item>
    <item name="loading_view_color">@color/colorAccent</item>
    <item name="loading_view_background">@color/white</item>
    <!--全局标题栏和状态栏配置-->
</style>
```
复制代码

2. Activity

  • 使用MVP的继承BasePresenterActivity
  • 不使用MVP的继承BaseActivity

3. Fragment

  • 使用MVP的继承BasePresenterFragment
  • 不使用MVP的继承BaseFragment

4. 如果使用RecycleView的时候,Adapter可以继承RecycleAdapter来使用

在app的build.gradle的android下添加如下代码:

//启用实验性功能
androidExtensions {
    experimental = true
}
复制代码

只需要实现以下两个方法

class UserAdapter(iPageControl: IPageControl):RecyclerAdapter<User>(iPageControl) {
    override fun layoutId(): Int {
        return R.layout.item_user
    }

    override fun bindViewHolder(holder: CommonViewHolder, m: User, position: Int) {
        //使用的experimental之后,可以直接holder.控件ID,不需要holder.itemView.控件ID
        holder.name.text = m.name
    }
}
复制代码

5. 注解使用

5.1 Title-标题

属性 类型 必须 默认 说明
value StringRes 标题内容
backgroundColor ColorRes 全局标题背景色 标题背景色
textColor ColorRes 全局标题文字颜色 标题文字颜色
backIcon DrawableRes 全局标题返回按钮图标 标题返回按钮图标

5.2 OnClickFirstDrawable-标题上第一个图标按钮的点击事件

属性 类型 必须 默认 说明
value StringRes 按钮图片内容

5.3 OnClickFirstText-标题上第一个文字按钮的点击事件

属性 类型 必须 默认 说明
value StringRes 按钮文字内容

5.4 OnClickSecondDrawable-标题上第二个图标按钮的点击事件

属性 类型 必须 默认 说明
value StringRes 按钮图片内容

5.5 OnClickSecondText-标题上第二个文字按钮的点击事件

属性 类型 必须 默认 说明
value StringRes 按钮文字内容

5.6 StatusBar-状态栏

属性 类型 必须 默认 说明
hide boolean false 隐藏状态栏
enabled boolean false 状态栏是否可用
transparent boolean false 状态栏透明

5.7 TimeLog-打印方法和构造方法执行的时间

属性 类型 必须 默认 说明
value LEVEL LEVEL.D 日志等级

5.8 ClickGap-重复点击延时

属性 类型 必须 默认 说明
value Long 800毫秒 重复点击间隔

5.9 Prefs-SharedPreferences注解生成器

属性 类型 必须 默认 说明
value String "" 别名
mode PrefsMode PrefsMode.MODE_PRIVATE 模式,对应PreferencesMode

5.10 PrefsField-SharedPreferences字段注解

属性 类型 必须 默认 说明
value String "" 字段别名,如果为空则取修饰字段的参数名称

6. 刷新分页

使用RefreshLayoutWrapper+RecyclerAdapter控件实现刷新功能

  • RefreshLayoutWrapper继承于SmartRefreshLayout,具体使用请看SmartRefreshLayout官方文档,默认每页数据量为16,如果想修改每页数据量,可使用如下方法更改:

    RefreshLayoutWrapper.pageSize = 16
    复制代码
  • RefreshLayoutWrapper实现了IPageControl,可以通过调用接口内的方法类获取刷新控件的状态和更改状态

    //获取刷新的状态
    iPageControl.getRefreshStatus()
    复制代码
  • RecyclerAdapter在实例化的时候传入IPageControl, 获取数据成功之后,只需要调用autoUpdateList(list)方法, 可以自动RefreshLayoutWrapper页码和刷新状态变化

  • 数据更新失败可以调用RecyclerAdapter.updateFailed()

  • 获取每页的数据量和下一页的页码,可以调用一下方法

    //每页的数据量
    RecyclerAdapter.pageSize = 16
    //下一页的页码
    RecyclerAdapter.nextPageIndex = 1
    复制代码

第三方库

SmartRefreshLayout-刷新控件

Immersionbar-状态栏

Dagger2

RxJava

RxAndroid

OkHttp

Retrofit

Gson

AndroidUtilKTX-工具类

LoadingView-Loading动画

关注下面的标签,发现更多相似文章
评论