原文

Key-Value(SharedPreference):

  • getPreferences()是Activity的接口,getSharedPreferences()是Context。前者是以Activity.getLocalClassName()为Key的
public SharedPreferences More ...getPreferences(int mode) {        return getSharedPreferences(getLocalClassName(), mode);}

,也就是说不能跨Activity共享

  • 源码中会检查文件是否被他人更改,标准是时间戳或大小有变化:
stat = Os.stat(mFile.getPath());return mStatTimestamp != stat.st_mtime || mStatSize != stat.st_size;
  • onChangeListener是放到一个WeakHashMap里的
  • new 一个SharedPreferences时会启动一个线程读文件,并上锁,对get、edit等操作形成阻塞
  • 如果在get之前没有load完成,会阻塞UI线程
  • apply和commit等任务实际上是串行的,一个过长可能会阻塞后面的
  • apply和commit都会写回文件,但是apply是异步的,commit是同步的,而且commit运行在UI线程
  • 对于没有apply或commit的改变是单独存在一个Map中的,不会影响get
  • 所有editor的同步锁对象都是当前editor,也就是说,不同editor的修改是无序的,只有commit、apply的锁对象是SharedPreference,是有序的
  • SharedPreference没有使用更高级的锁,基本上可以认为文件操作上使用synchronized块就ok了

File

  • 机身内部存储是ext4格式,sd卡(包括机身内置的)是fat32格式。文件数多时,内部存储要比外部存储快很多。甚至使用仿ext4寻址方式的大文件存储小文件要比fat32直接存储要快(微信)
  • 卸载时,仅使用getExternalFilesDir()得到的外部存储文件会被清除
  • 相关文件地址:
    • getFilesDir:/data/data/package/files
    • getCacheDir: /data/data/package/cache
    • getObbDir: /sdcard/Android/obb/package—游戏数据包
    • getDatabasePath: /data/data/package/databases
    • getDir: /data/data/package/filename
    • getExternalCacheDir: /sdcard/Android/data/package/cache
    • getExternalFilesDir: /sdcard/Android/data/package/files/type

Sqlite

  • 数据库结构是由Schema(create table语句)确定的,每次load数据库都会构建Schema,所以分表可能会导致load过慢(微信)
  • 官方建议在创建Table的时候,同时构建一个contract类,把所有的常量都存起来,结构像R文件一样
  • getWritableDatabase()、getReadableDatabase()是运行很长一段时间的,所以应该在非UI线程中执行
  • 对于某一列,如果没有设值,会插入NULL,如果设置null了,则不会插入
  • 尽量不要使用rawquery方法,而是使用相应的函数,尽量避免注入

更多相关文章

  1. 总结android中的.gradle文件写法及含义
  2. [Android Studio] 使用本地 aar 文件
  3. Android Studio 实时显示布局文件Preview窗口
  4. Android 学习 之 资源文件 动态修改strings.xml中的字符资源
  5. Android中通过其他线程更新主线程UI
  6. Android初始化OpenGL ES,并且分析Renderer子线程原理

随机推荐

  1. Android下一个apk安装多个程序入口图标
  2. Android 实现简单的刮刮乐
  3. Android(安卓)icon 不同屏幕下尺寸
  4. Android修改默认打开WLAN随时都可扫描
  5. 解决Android Studio报的警告:Resource IDs
  6. Android 限制EditText输入小数点后面位数
  7. Android中ProgressBar用法简单实例
  8. Android获取字体高度和设置行高
  9. android binder机制之——(创建binder服务
  10. android 5.0后矢量图形