优化点
1、不要在onCreate方法中同步进行io操作
同步io操作会十分耗时,直接导致Application的运行速度。
2、不要在onCreate方法中初始化sp后立即操作sp
Context.getSharedPerfences(String name,int mode);会启动单独的线去加载sp,如下:
private void startLoadFromDisk() {
synchronized (this) {
mLoaded = false;
}
new Thread("SharedPreferencesImpl-load") {
public void run() {
synchronized (SharedPreferencesImpl.this) {
loadFromDiskLocked();
}
}
}.start();
}
虽然sp的加载是单独的线程去获取的,但是如果sp比较大,直接调用get获取数据,则需要wait 直到sp加载完成。
synchronized (this) {
awaitLoadedLocked();
Boolean v = (Boolean)mMap.get(key);
return v != null ? v : defValue;
}
private void awaitLoadedLocked() {
if (!mLoaded) {
// Raise an explicit StrictMode onReadFromDisk for this
// thread, since the real read will be in a different
// thread and otherwise ignored by StrictMode.
BlockGuard.getThreadPolicy().onReadFromDisk();
}
while (!mLoaded) {
try {
wait();
} catch (InterruptedException unused) {
}
}
}
3、简单配置,最好使用Manifest.xml metadata 配置,否则使用小sp保存
manifest.xml的加载是系统在应用安装时预先加载到packageManagerService中保存的,所以会比文件配置再读取io更合适。
如果第一次打开应用的初始化配置项需要必须在oncreate读取,则把这些简单的配置项,建立一个单独的sp保存,这样配置项目少,读取时间也会短一些。
4、按需加载
一些不必要放在oncreate中初始化的项目,应该通过Service或单独开启线程去加载资源。等oncreate需要用到的时候加载,保证不会阻塞ui线程。
5、设置过度Activity
不给activity设置layout,只给activity的主题设置windowbg,在oncreate添加跳转的逻辑。
总结
实际是最重要的一步,这些优化点是通过对公司项目的Application优化得来的,特别是sp的优化,其中异步初始化加锁,调用时等待,初始化完成后唤醒这个设计十分有用。