java和kotlin结合的项目需要注意的点

一:总结下目前我们Android项目结合kotlin语言过程中遇到的一些问题

1,库依赖及插件工具

在使用kotlin前我们使用的是android jetPack组件 MVVM架构 livedata lifeCycle dataBinding等 但是没有使用数据库的业务,在新版本迭代时需要数据库功能所以准备使用room 并使用kotlin实现这一块的功能,所以项目里引用了kotlin的依赖

//Android Room Persistence Library

implementation"android.arch.persistence.room:runtime:$archRoomVersion"

kapt"android.arch.persistence.room:compiler:$archRoomVersion"

implementation"android.arch.persistence.room:rxjava2:$archRoomVersion"

但是问题出现了:在使用kotlin编写的room @Dao @Entity 都没有问题 只有使用@Database(entities = [xxxxxx::class], version =1, exportSchema =false)这个注解的时候编译不通过报错信息是 Android room persistent: xxxxx_Impl does not exist 解决了这个问题后又出现了databinding的编译不通过,找不到符号。stackoverflow上查找了好多解决方案试过都不行,最后还是切换回了java实现room 同时依赖的databinding room 的processor 需要改成kapt 正确的依赖如下:

//Android Room Persistence Library

implementation"android.arch.persistence.room:runtime:$archRoomVersion"

kapt"android.arch.persistence.room:compiler:$archRoomVersion"

implementation"android.arch.persistence.room:rxjava2:$archRoomVersion"

//Android lifecycle

implementation"android.arch.lifecycle:extensions:$archLifecycleVersion"

kapt"android.arch.lifecycle:compiler:$archLifecycleVersion"

这样最终实现功能。

2,在使用kotlin实现的功能模块中 如果是java这边调用了kotlin的方法 那么必须保证参数不为null 因为kotlin里是不容许null值得 除非声明 Type?这样得类型。否则就会抛出非法参数异常 IllegalArgumentException 

3,在kotlin里 我们应该使用kotlin的一些表达式 例如

wen替换 switch

list的forEachIndex  foreach 

无处不在的lambda表达式   foreach中 rxjava中 

elvis  with apply................  太多了 继续学习中。

关于kotlin代码中调用java方法

var jpeg: JpegExtension = ExifUtils.getJpegExtension(path) 这行代码如果方法返回null 那么就会抛出异常  因为kotlin中不容许null 除非我们明确定一类型为可空类型 如下

var jpeg: JpegExtension? = ExifUtils.getJpegExtension(path)

你可能感兴趣的:(java和kotlin结合的项目需要注意的点)