很久以前有个项目进行了启动优化,当时自己弄了好久
现在拿出来看下,确实很简单,看了下网上的一些启动框架
确实没法比,不过很适合我们导航项目,记录下来,以后慢慢改进
在 Application的oncreate里差分成同步接口和异步接口以及异步等待接口,
在activity里可见的时候(onWindowFocusChanged)差分出个接口来执行不重要的加载
public class BootTask extends BaseBootTask{
private static BootTask mInstance;
public static BootTask getInstance() {
if (mInstance == null) {
mInstance = new BootTask();
}
return mInstance;
}
@Override
void onApplicationSync(MyApp app) {
//同步操作放这里
}
@Override
public ArrayList
//异步操作放这里
return null;
}
@Override
public ArrayList
//依赖账户路径的操作放这里
}
@Override
void onAppVisibled(Activity activity) {
//显示后慢慢加载的放这里
}
}
看下它的基类,对异步放入了线程池,对依赖加了CountDownLatch:
public abstract class BaseBootTask {
public static final String TAG = BaseBootTask.class.toString();
//当前项目仅一处依赖(等待账户文件路径初始化)
private CountDownLatch mCount = new CountDownLatch(1);
protected ExecutorService threads;
BaseBootTask() {
threads = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
}
abstract void onApplicationSync(MyApp app);
//异步操作放这里
public abstract ArrayList
//仅支持子线程等待,主线程不能被阻塞
public abstract ArrayList
//就是界面显示后的流程(onWindowFocusChanged)
abstract void onAppVisibled(Activity activity);
//等待完成的地方需要调用此接口释放 等待线程
public void setCountDown() {
mCount.countDown();
}
private void waitAsync() {
try {
mCount.await();
} catch (InterruptedException e) {
} finally {
}
for (Runnable r : onWaitAsync()) {
threads.execute(r);
}
}
private void applicationAsync() {
for (Runnable r : onApplicationAsync()) {
threads.execute(r);
}
}
}
然后就是将原来放在 applacation 以及activity oncreate,onstart,onresume 里面的代码移入对应的接口里面。
applacation里面不重要的流程也可以移到 onAppVisibled 里面,不仅仅是 activity里面的接口