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全删了,這樣體積縮減得更多。