基于kotlin的mvp写的一款生活常用app。封装了很多常用的功能,以及开发中比较常用框架,对开发注意点和使用第三方框架问题和注意点进行记录和深入分析。
- 一键注入依赖。
- 事件分发
- 引用的本地存储方式
- 模仿android的Handler机制实现易用队列Queue,内部使用HandlerThread
- RxBus,Rxjava2方式
- Aop编程支持(@Async @Cacheable @DebugTrace @HookMethod @LogMethod @Prefs @Safe)。Aop方式测试XML存储和对象序列化存储性能上的差异
在Project gradle 配置中添加
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:1.0.10'
}
在module gradle 配置中添加
apply plugin: 'com.hujiang.android-aspectjx'
1. FloatingView
使用了开源的 FloatingView 库,基于Facebook的POP动画库
需要注意的是,compile 'com.ufreedom.uikit:FloatingViewLib:1.0.2'
这个版本中的没有对结束后的动画View做回收处理,但是由于是接口形式依赖,我们可以自己去实现,再动画结束后调用yumFloating.clear()
基于AppCompatActivity的偷换控件原理实现了无缝换肤功能。参照源码实现在Activity onCreate中为LayoutInflater setFactory, 将View的创建过程交给自定义的SkinCompatViewInflater类来实现 原博客地址为: Android-skin-support 一款用心去做的Android 换肤框架
3. BaseRecyclerViewAdapterHelper
a .BaseQuickAdapter
的setEmptyView
在下面情形下有crash的bug问题:当Adapter加入了HeaderView,然后调用setEmptyView
,就会crash。具体处理参考:UpcomingFragment
(一个即将来袭电影的Fragment)
b .BaseQuickAdapter
设置了 setOnItemLongClickListener
后不能设置OnItemLongClickListener为null,这样会出现空指针异常,这与库中实现原理相关,具体参考源码。
c .多布局类型时,自定义类型的int值不能与 BaseQuickAdapter
中 HEADER_VIEW,LOADING_VIEW,FOOTER_VIEW,EMPTY_VIEW
值有雷同,否则就会crash。
d .刷新和加载更多功能:1. 比如我想onRefresh回调中,如果服务器返回hasMore为false,应该显示no More
data.我们应该这样做:
一个很方便基于Kotlin写的日志打印库,作者是 Tony Shen(现魔窗移动端负责)。并且基于Kotlin的特性扩写了很多功能,详细请移步:LExt.kt
a. Sp存储Json和Object序列化方式性能的比较
Sp存储是存储的是json字符串要转化为具体的对象还需要json反序列化为对象,性能比Object直接序列化到文件差。测试文件为 AopTestActivity
。更多详情请移至:请不要滥用SharedPreference
b. ConstraintLayout
利用约束布局减少层级关系,详见 view_mv_detail_header.xml
.参考:
match_parent is not supported
:match_parent is not allowed. But you can actually set width and height to 0dp and set either top and bottom or left and right constraints to "parent".
- 加载图片 glide 第一次加载图片有些显示不全,滑动到最低下再反过来就能看到完成的图片,但是picasso加载不会有这个问题,为什么呢?
- Kotlin assert 问题
- RecyclerView中TextView的
getLineCount()
返回zero,及时通过 Stack Overflow 上的post Runnable任务任务获取也跟自己的预期不符。
-keep class com.jackyang.android.support.injection.**{*;}