基于Droid的AsyncTask问题

时间:2010-02-15 09:11:49

标签: java android root

我在Android市场上有一个名为DigiClock小部件的小部件,在上次更新后,我已经在根植摩托罗拉机器人上遇到了一些非常罕见且随机的问题(可能有其他手机有问题,但是唯一的我所拥有的反应来自有根的机器人用户)。启动运行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(不是2.1或1.6)

列出packages = getPackageManager()。getInstalledPackages(PackageManager.GET_ACTIVITIES);

在我的情况下崩溃了,但是

列出packages = getPackageManager()。getInstalledPackages(0);

2 个答案:

答案 0 :(得分:2)

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

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

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

  • 此外,您的代码不会阻止两个线程同时访问“menuEntries”。修复此部分的最简单方法是将对setListAdapter()的调用移出onCreate()并移入onPostExecute()。

答案 1 :(得分: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上测试我的应用程序而不仅仅是边缘情况的痛苦:/