异步任务+递归 进行初始化文件读取方法

其实在普通的应用开发中,很少遇到我要说明的问题,因为我们没有那么多的本地配置文件,当然有时候我们会遇到,好吧,这样说可能看不懂,我直接说一个例子吧。

  1. 将要配置的信息(也就是实例化的信息保存到本地文件)在启动的时候进行读取来完成初始化
  2. 从网络获取,将配置信息保存到服务器,

以上两种都是保存配置文件的位置和使用手段,他们有一个共同点,就是两者都是比较耗时的操作,当然,提到耗时,每个人想到的都是异步,是的,是要用异步,这时将会出现一个问题 ,异步进行读取的消耗时间我们是不能控制的,这是异步和主线程谁先执行完成,我们是不能确定的,这时就不能完成初始化操作了,这时我们为了能确保性能,可以使用异步任务配合递归的方式来完成

异步任务配合递归的方式来完成初始化时的耗时读取

这个在Launcher 开发中有例子,递归呢,也要符合两个条件,

  1. 有出口
  2. 内容有变化(一般是减少使用次数)

    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();
}```

在我们的应用开发中我们并不是要在初始化的时候做耗时操作 但是如果有,这却是是一种好方法

猜你喜欢

转载自blog.csdn.net/qq_32648731/article/details/77892881
今日推荐