编程语言
首页 > 编程语言> > Android启动应用程序,直到异步代码执行完成,然后再打开活动

Android启动应用程序,直到异步代码执行完成,然后再打开活动

作者:互联网

在启动应用程序时,我想执行一些初始化代码.

我需要初始化:

> RESTkit通过设置一些HTTP标头
>需要向服务器发出请求以获取有关当前用户的信息
>需要向服务器请求从当前用户获取配置

如您所知,这些是我需要执行的异步任务.

我现在拥有的是MainActivity.onCreate()中带有初始化方法的初始化代码,该方法将打开CoreActivity.当我对应用程序进行冷启动时,这可以正常工作.

该问题从应用程序移至后台的那一刻开始出现,Android可以杀死它以释放内存.我现在通过禁止开发人员选项下的后台进程来强制执行此行为.

因此,如果我打开了ExampleActivity并将应用程序移至后台,那么当我将其移至前台时,Android会尝试重新初始化ExampleActivity.这意味着我的应用程序未正确初始化,因为从未执行MainActivity.onCreate().

所以我认为我可以将初始化代码移至Application.onCreate().我在这里面临的问题是,即使初始化代码仍在运行,onCreate()仍可完成执行并打开ExampleActivity.

我注意到在Application.onCreate()中休眠主线程是不好的.还有一个while循环来监视isInitialized布尔值永远不会变为真,并以无限循环结束.

我应该如何处理这种情况?

我想做这些步骤

>应用启动
>应用正在初始化,需要等待我的回调方法
>初始化完成后调用回调方法,打开活动.

解决方法:

多年来,我的申请中存在一个非常紧密的问题.即在开始几乎所有活动(甚至onResume …)之前,我需要确保已初始化我的应用程序.
到目前为止,我已经在许多活动的onCreate方法中插入了对同步初始化代码的调用(在初始化已经完成的情况下,该调用当然会立即完成).

随着应用程序逐渐增长,初始化需要越来越多的时间,这有时会在不同的活动中引起ANR,因此我也开始需要在任何活动开始时实现异步初始化.

因此,我最近实现了以下方法,可以对其进行检查/测试(请参阅GitHub项目,尤其是此类:MyContextHolder.java)

>将对我的静态定义的应用程序初始化代码的调用插入到每个活动的onCreate方法中,这需要将应用程序初始化,并将调用的Activity实例(this)传递给初始化代码.基本上看起来像:

if (MyContextHolder.initializeThenRestartMe(this)) {
    return;
}

>一个如果初始化已经完成,则立即返回false.
做完了

b.如果需要初始化,请在应用程序的上下文中获取Activity的启动参数,以便稍后可以重新启动Activity.最简单的情况是:存储活动的意图. (activity.getIntent()和activity.getApplicationContext())
>使用.finish()方法完成尚未显示的活动.
>(可选)向用户显示一些“请稍候…”活动. (我还不需要这个…)
>使用applicationContext在后台线程(专用AsyncTask)中进行应用程序初始化.参见MyFutureContext.java)
>完成后,使用其存储的参数重新启动活动.例如.使用存储的Intent和应用程序的上下文.像这样:
applicationContext.startActivity(intent);

一个有用的提示:为了避免闪烁的活动正在重新启动,请将默认应用程序的主题(在Android清单中)设置为透明主题.超!

下面的样式定义来自themes.xml文件

<style name="Theme.Transparent" parent="Theme.AppCompat.NoActionBar">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:backgroundDimEnabled">false</item>
</style>

标签:android-lifecycle,android
来源: https://codeday.me/bug/20191111/2022599.html