利用工作之外的时间终于看完了xutils3的所有模块的源码,以此博客来记录自己的分析过程,在此约定半年之后重新分析xUtils3源码对比该系列博客看看自己有没有新的突破。
1. xUtils3源码解析之—–image
2. xUtils3源码解析之—–Http(s)
3. xUtils3源码分析之—–DB(ORM)
4. xUtils3源码分析之—–view注解
基本使用方法
配置的一些源码分析
1.DbManager db = x.getDb(daoConfig)通过DbManager.DaoConfig 配置实例得到具体的DbManagerImpl实例,x.getDb(daoConfig)方法里通过调用DbManagerImpl的静态方法getInstance(daoConfig)例得到具体的DbManagerImpl实例,getInstance方法里首先看DAO_MAP集合(key:daoConfig value:DbManagerImpl)是否有对应的DbManagerImpl实例,有的话替换daoConfig,否则创建个实例,再保存到DAO_MAP集合方便下次使用;
2.创建DbManagerImpl实例主要通过openOrCreateDatabase得到SQLiteDatabase,将DaoConfig里面的一些属性赋值到自己,
然后通过DaoConfig的dbOpenListener接口回调onDbOpened(DbMan ager db)方法;3.getInstance方法得到了DbManagerImpl后,通过比较DbManagerImpl里面的SQLiteDatabase的数据库版本跟DaoConfig的数据库版本,如果不相等则设置新的数据库版本号;
**org.xutils.x;类**
public static DbManager getDb(DbManager.DaoConfig daoConfig) {
return DbManagerImpl.getInstance(daoConfig);
}
**org.xutils.db.DbManagerImpl;类**
public synchronized static DbManager getInstance(DaoConfig daoConfig) {
if (daoConfig == null) {//使用默认配置
daoConfig = new DaoConfig();
}
DbManagerImpl dao = DAO_MAP.get(daoConfig);
if (dao == null) {
dao = new DbManagerImpl(daoConfig);
DAO_MAP.put(daoConfig, dao);
} else {
dao.daoConfig = daoConfig;
}
// update the database if needed
SQLiteDatabase database = dao.database;
int oldVersion = database.getVersion();
int newVersion = daoConfig.getDbVersion();
if (oldVersion != newVersion) {
if (oldVersion != 0) {
DbUpgradeListener upgradeListener = daoConfig.getDbUpgradeListener();
if (upgradeListener != null) {
upgradeListener.onUpgrade(dao, oldVersion, newVersion);
} else {
try {
dao.dropDb();
} catch (DbException e) {
LogUtil.e(e.getMessage(), e);
}
}
}
database.setVersion(newVersion);