代码之家  ›  专栏  ›  技术社区  ›  DavidG

根Droid上的AsyncTask有问题

  •  0
  • DavidG  · 技术社区  · 16 年前

    我在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

    机器人身上发生的事情是: *弹出进度框 *进度框在完成运行前解除 *出现空列表

    似乎获取应用程序的异步任务被杀死了。这有可能吗?

    谢谢, 戴维

    编辑 :

    发现了问题,结果发现在Android 2.0中(不是2.1或1.6)

    list packages=getPackageManager().getInstalledPackages(packageManager.get_activities);

    在我的情况下崩溃,但是

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

    不。

    2 回复  |  直到 16 年前
        1
  •  2
  •   Luke Dunstan    16 年前

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

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

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

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

    发现了问题 在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上测试我的应用程序的痛苦,而不仅仅是边缘案例:/