【发布时间】:2015-11-26 08:07:24
【问题描述】:
我正在尝试获取设备第三方和系统上所有应用程序的列表,我在AsyncTask 中运行此操作,当应用程序打开任务运行时,我看到在此操作期间获取此列表时的操作很长,我看到了Logcat 中打印的警告,我认为这是长时间操作的原因:
11-26 09:51:23.720 1739-1846/com.example.AppList W/ResourceType: No package identifier when getting value for resource number 0x00000000
11-26 09:51:23.720 1739-1846/com.example.AppList W/PackageManager: Failure retrieving resources for com.google.android.onetimeinitializer: Resource ID #0x0
11-26 09:51:23.870 1739-1846/com.example.AppList W/ResourceType: No package identifier when getting value for resource number 0x00000000
11-26 09:51:23.870 1739-1846/com.example.AppList W/PackageManager: Failure retrieving resources for com.qualcomm.shutdownlistner: Resource ID #0x0
11-26 09:51:23.994 1739-1846/com.example.AppList W/ResourceType: No package identifier when getting value for resource number 0x00000000
11-26 09:51:23.994 1739-1846/com.example.AppList W/PackageManager: Failure retrieving resources for com.android.wallpapercropper: Resource ID #0x0
11-26 09:51:24.744 1739-1846/com.example.AppList W/ResourceType: No package identifier when getting value for resource number 0x00000000
11-26 09:51:24.744 1739-1846/com.example.AppList W/PackageManager: Failure retrieving resources for com.android.documentsui: Resource ID #0x0
11-26 09:51:24.873 1739-1846/com.example.AppList W/ResourceType: No package identifier when getting value for resource number 0x00000000
11-26 09:51:24.874 1739-1846/com.example.AppList W/PackageManager: Failure retrieving resources for com.android.externalstorage: Resource ID #0x0
....
....
/**
* I got all installed and system apps on the device
* listed as the above in the logcat as Warning.
*/
....
.... to the end.
这是doInBackground 代码:
@Override
protected final List<App> doInBackground(List<App>... params) {
PackageManager pm = getActivity().getPackageManager();
List<ApplicationInfo> appsList = pm.getInstalledApplications(0);
List<PackageInfo> packList = pm.getInstalledPackages(0);
List<App> userApps = new ArrayList<>();
int totalApp = appsList.size();
for (int i = 0; i < totalApp; i++) {
ApplicationInfo info = appsList.get(i);
final App app = new App();
app.setIcon(info.loadIcon(getActivity().getPackageManager()));
app.setName(info.loadLabel(getActivity().getPackageManager()).toString());
app.setPackageName(info.packageName);
if ((info.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
userApps.add(app);
}
}
return userApps;
}
那么如何解决这个问题,或者只是如何解决长时间操作?
编辑
我试图从列表中删除应用程序图标功能,它的加载速度比附加图像时更快,所以图像中的问题
@David Corsalini 在comments 中告诉我这个:
在后台线程中加载位图,从
holder.bind()方法调用此后台线程。我没有这个的代码。
我正在使用ListView 和ViewHolder,但不知道holder.bind(),请问如何实现?!
【问题讨论】:
-
你能把你的代码贴出来吗?
-
其实这不是我们的问题,是android的问题,有时我们得到了资源,有时没有。关于长时间运行,这取决于您设备中安装的应用程序数量。
-
我测试了其他应用都没有这个问题,所以为什么在我的应用中,肯定有错误但我找不到!
-
我认为加载时间长是因为您加载了图标位图。如果您在 ListView/RecyclerView 中使用此应用程序列表,您可以从 ViewHolder 加载位图。这样,您将只加载所需的位图,并且仅在您真正需要它们时加载。
-
我在尝试加载系统应用程序图标时看到了这类错误。这些应用没有图标,因此您会收到错误消息。
标签: android asynchronous android-asynctask logcat android-package-managers