0

我在 Android 市场上有一个名为 DigiClock 小部件的小部件,在上次更新后,我在根深蒂固的摩托罗拉 Droids 上遇到了一些极其罕见和随机的问题(可能还有其他手机有问题,但我唯一的回应是)已经来自有根的机器人用户)。当启动运行 AsyncTask 的 Activity 时会出现问题,该 AsyncTask 从设备中检索所有已安装的应用程序,同时显示 ProgressDialog(水平样式)。可在此处找到适用的 java 代码文件:

http://code.google.com/p/android-digiclockwidget/source/browse/trunk/src/com/davidgoemans/simpleClockWidget/LauncherChooser.java

如果您希望区分工作版本和非工作版本之间所做的更改,可以在这里找到:

http://code.google.com/p/android-digiclockwidget/source/diff?spec=svn10&old=7&r=9&format=side&path=/trunk/src/com/davidgoemans/simpleClockWidget/LauncherChooser.java

机器人上似乎发生的事情是: * 进度框弹出 * 进度框在完成运行之前消失 * 显示空列表

似乎获取应用程序的 AsyncTask 被杀死了。这可能吗?

谢谢,大卫

编辑

发现问题,原来是在 Android 2.0 ( NOT 2.1 or 1.6 )

列出包 = getPackageManager().getInstalledPackages(PackageManager.GET_ACTIVITIES);

在我的情况下崩溃,但是

列出包 = getPackageManager().getInstalledPackages(0);

没有。

4

2 回答 2

2

我不确定这是否是导致症状的原因,但我可以看到代码存在一些问题:

  • 除了主 UI 线程之外,您不得从任何线程操作像 ProgressDialog 这样的 UI 对象,因为 UI 对象不是线程安全的。不要调用progressDialog.setProgress(),而是调用AsyncTask.publishProgress(),然后覆盖AsyncTask.onProgressUpdate()。

http://developer.android.com/resources/articles/painless-threading.html

  • 此外,您的代码不会阻止两个线程同时访问“menuEntries”。修复此部分的最简单方法是将调用 setListAdapter() 从 onCreate() 移到 onPostExecute()。
于 2010-02-15T14:50:43.520 回答
1

发现问题,原来是在 Android 2.0(不是 2.1 或 1.6)

List packages = getPackageManager().getInstalledPackages(PackageManager.GET_ACTIVITIES);

在我的情况下崩溃,但是

List packages = getPackageManager().getInstalledPackages(0);

没有。我通过在 2.0 模拟器中测试发现了这一点。这增加了现在必须在 1.5、1.6、2.0 和 2.1 上测试我的应用程序而不仅仅是边缘情况的痛苦:/

于 2010-02-15T17:08:16.573 回答