在安卓上初始化加载缓慢的资源?



我有一个用Java编写的Android应用程序。 它使用一个需要几秒钟才能加载的 Java 类(有些.csv文件和 jar

(。加载这些东西的惯用方法是什么?

我继承了代码,现在它尝试在后台加载它,但我认为有一些竞争条件会导致错误。

我只想要一个不错的、同步的、缓慢但可靠的加载(比如,启动画面(。

我找到了很多关于实现初始屏幕的博客文章。

有正式版本吗?

在后台加载的代码:

/**
* Initialize staticAnthro if it is null.
* This class loads CSV files, so do it in the background.
*/
static class InitInBackground extends AsyncTask<Void, Integer, Boolean> {
@NonNull
@Override
protected Boolean doInBackground(Void... arg0) {
startedInit = true;
try {
if (staticAnthro == null) {
staticAnthro = new Anthro();
}
} catch (IOException e) {
Log.e(LOGGER_TAG, "Error starting Anthro class", e);
}
return true;
}
}

首先,使用 AsyncTask 已经过时,可能会导致内存泄漏等错误,尤其是在长时间运行的任务时。想象一下这种情况,您的 AsyncTask 已启动并正在进行中,但您旋转手机,必须重新创建活动,但由于它仍然包含对您的 AsyncTask 的引用,因此它不会被垃圾回收 - 繁荣内存泄漏。

阅读此处的第二段以获取更多信息和替代方案。

如果你可以使用 Kotlin,看看协程,否则试试 RxJava。

对于初始屏幕部分:据我所知,有两种方法可以实现启动画面,官方方法是在styles.xml中定义一个新样式,如下所示:

<style name="YourTheme.Launcher">
<item name="android:windowBackground">
@drawable/launch_background
</item>
</style>

然后在AndroidManifest.xml中设置android:theme=@styles/YourTheme.Launcher

另一种方法是创建启动画面视图,该视图一直显示到后台任务完成。这可以通过RxJava,协程来实现

我同意@jakubas-trinkunas关于使用AsyncTask的观点。 但是,据我了解,问题是 - 应该在哪里加载资源? 我的意见 - 应用类 如何?所以,你应该自己决定。恕我直言,最好的方法是启动服务来执行此操作,然后在启动屏幕上等待它完成。

最新更新