Realm数据库有着不错的性能,使用方便,但同时也有着恼人的缺点:
不能跨线程调用,就是说,你在A线程创建了Realm对象R,那么你不能在B线程去使用这个R,解决方法:
1. copy出一个R的副本,以便在其他线程读取。
2. 使用Handler切换到A线程,然后调用R执行存储数据操作,并及时更新相关数据。
3. 在其他线程创建新的Realm对象R2,利用R2存储数据,然后通知其他线程重新去数据库获取最新数据。
一些参考资料:
http://www.jianshu.com/p/52a9f84b158f
http://www.cnblogs.com/RaphetS/p/5996265.html
http://www.jianshu.com/p/fdc9492b714a
https://www.zhihu.com/question/30298585
ndk冲突:
http://blog.csdn.net/u010134293/article/details/53375137
http://blog.csdn.net/jabony/article/details/65441297
方法数量超过限制:
http://blog.csdn.net/hjz19921130/article/details/73610238
过滤掉不支持的平台,那么打包成APK之后体积就不会那么大了:
// We don't use these .so files of Realm, remove theme to reduce the size of APK file.
packagingOptions {
exclude "lib/arm64-v8a/librealm-jni.so"
exclude "lib/mips/librealm-jni.so"
exclude "lib/x86/librealm-jni.so"
exclude "lib/x86_64/librealm-jni.so"
}
defaultConfig {
ndk {
abiFilters "armeabi", 'armeabi-v7a'
}
}
NDK so库冲突(找不到)的问题:
现在场景是这样的:Realm不支持armeabi,而我的项目只支持armeabi,编译的时候,报找不到so库的错误。
解决方法:
1. gradle(Module:app)中增加:
defaultConfig {
ndk {
abiFilters "armeabi", 'armeabi-v7a'
}
}
以支持armeabi和armeabi-v7a两种架构。
2. 在项目的app/libs路径下,也就是armeabi文件夹所在路径,新建一个armeabi-v7a文件夹,并把armeabi里的so全部拷贝到armeabi-v7a文件夹里。
对于一般的项目而言,上面两步就解决了,然后我这个项目最坑的地方就是:引用了一个aar文件,这个aar文件里居然也有so库!刚开始的时候,我一直纳闷,为什么明明没有问题啊,原来是这个aar里只支持armeabi,好吧,那我就把aar解压,取出里面的so库,拷贝到我们在步骤2新建的文件夹里。编译,终于通过了。
Tips:如果你确定你的项目只需要支持的armeabi-v7a的话,甚至可以把armeabi全删了,这样体积缩减得更多。