java - 为什么 resolveInfo.loadLabel () 如此慢得离谱?

标签 java android performance android-launcher

在我的主屏幕替换应用程序中,我必须获取所有已安装应用程序的列表才能将它们放入应用程序抽屉中。因此,以下方法会在每个应用程序上运行;

public static App fromResolveInfo (Context context, PackageManager pacMan, AppManager appManager, ResolveInfo resInf)
{
    String label = resInf.loadLabel (pacMan).toString ();
    String packageName = resInf.activityInfo.applicationInfo.packageName;
    String activityName = resInf.activityInfo.name;

    App app = new App (context, appManager);
    app.setLabel (label);
    app.setPackageName (packageName);
    app.setActivityName (activityName);

    AppIcon icon = null;
    if (appManager.isIconPackLoaded ())
        icon = appManager.getIconPack ().getIconForApp (app);
    if (icon == null)
        icon = appManager.getIconPack ().getFallbackIcon (resInf.loadIcon (pacMan));

    app.setIcon (icon);

    return app;
}

问题是这里有一个瓶颈,而不是他最初预期的图标加载。该方法的第一行 (String label = resInf.loadLabel (pacMan).toString ();) 可能会占用 0 到 250 毫秒之间的任何时间(在相对高端的设备上)。在旧设备上,这成为一个真正的问题。
在我的测试中,我注意到当一个较慢的设备进行多任务处理并且由于某种原因必须重新加载应用程序抽屉时,完成此操作可能需要长达 30 秒(在所有安装的应用程序)。

缓存可以为此提供一个潜在的解决方案,但是如果应用程序的名称发生变化(偶尔会发生)怎么办?我必须从缓存中获取标签,然后在单独的线程中遍历所有应用程序并更正已更改的标签。这可能提供了一个解决方案,但它看起来更像是一个肮脏的黑客而不是一个真正好的解决方案。

有没有更快的方法来获取应用程序 Activity 的标签?另外,为什么 Android 需要这么长的时间才能获得应用的标签,和/或我能做些什么吗?

最佳答案

您可以获得标签为:

String label = (String) resInf.activityInfo.applicationInfo.loadLabel(pacMan);

如果您比较这两种方法的 Android 源代码,您会注意到 applicationInfo 中的方法执行的代码更少。也许瓶颈在于额外的代码。我个人从未比较过那些执行时间,因为我从未观察到此类问题。

关于java - 为什么 resolveInfo.loadLabel () 如此慢得离谱?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31188658/

相关文章:

multithreading - Qt GUI 中许多小部件的快速更新

xml - Windows Phone 7 - 加载一个大的 xml 文件

java - 如何在 NatTable 单元格中插入两个文本,每个文本具有不同的字体?

java - 如何将数组从 java android Activity 类传递到普通 java 类?

android - 来自 Android 服务的警报对话框

android - 将参数传递给 AsyncTask,并返回结果

Android 滑入滑出 Activity

java - 解析长日志文件时出错?

java - jar文件无法将文件写入本地机器

Android启动画面一开始是白色的?