其实在普通的应用开发中,很少遇到我要说明的问题,因为我们没有那么多的本地配置文件,当然有时候我们会遇到,好吧,这样说可能看不懂,我直接说一个例子吧。
- 将要配置的信息(也就是实例化的信息保存到本地文件)在启动的时候进行读取来完成初始化
- 从网络获取,将配置信息保存到服务器,
以上两种都是保存配置文件的位置和使用手段,他们有一个共同点,就是两者都是比较耗时的操作,当然,提到耗时,每个人想到的都是异步,是的,是要用异步,这时将会出现一个问题 ,异步进行读取的消耗时间我们是不能控制的,这是异步和主线程谁先执行完成,我们是不能确定的,这时就不能完成初始化操作了,这时我们为了能确保性能,可以使用异步任务配合递归的方式来完成
异步任务配合递归的方式来完成初始化时的耗时读取
这个在Launcher 开发中有例子,递归呢,也要符合两个条件,
- 有出口
内容有变化(一般是减少使用次数)
Launcher 呢,大家都知道,他在初始化的时候可能要加载的东西可能会很多,并且要在应用刚创建的时候进行初始化,换句话就是说onCreate()中进行操作
onCreate(){
.....
checkForLocaleChange();
setContentView(R.layout.launcher);
....}```
private void checkForLocaleChange() {
if (sLocaleConfiguration == null) { //递归的出口条件
new AsyncTask<Void, Void, //异步任务LocaleConfiguration>() {
@Override
protected LocaleConfiguration doInBackground(Void... unused) {
LocaleConfiguration localeConfiguration = new LocaleConfiguration();
readConfiguration(Launcher.this, localeConfiguration);
return localeConfiguration;
}
@Override
protected void onPostExecute(LocaleConfiguration result) {
sLocaleConfiguration = result;
checkForLocaleChange(); //递归
}
}.execute();
return;
}
//更新配置信息 异步执行完成 并将结果重新发布到checkForLocaleChange
//方法中的时候,由于sLocaleConfiguration 不再是空的,因此checkForLoca
// leChange要继续后续的更新流程
updateConfigurationInfo();
}```
在我们的应用开发中我们并不是要在初始化的时候做耗时操作 但是如果有,这却是是一种好方法