Проблема с AsyncTask на рутированном Droid - PullRequest
0 голосов
/ 15 февраля 2010

У меня есть виджет на рынке Android под названием DigiClock widget, и после последнего обновления у меня возникли очень редкие и случайные проблемы на рутированных Motorola Droids (могут быть другие телефоны с этой проблемой, но толькоОтветы, которые у меня были, получены от пользователей root.Проблема возникает, когда запускается действие, которое запускает 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)

Список пакетов = getPackageManager (). GetInstalledPackages (PackageManager.GET_ACTIVITIES);

вылетает в моей ситуации, но

Список пакетов = getPackageManager (). GetInstalledPackages (0);

нет.

Ответы [ 2 ]

2 голосов
/ 15 февраля 2010

Я не уверен, является ли это причиной симптомов, но я вижу некоторые проблемы с кодом:

  • Вы не должны манипулировать объектами пользовательского интерфейса, такими как ProgressDialog, из любого потока, кроме основного потока пользовательского интерфейса, поскольку объекты пользовательского интерфейса не являются поточно-ориентированными. Вместо вызова progressDialog.setProgress (), вызовите AsyncTask.publishProgress (), а затем переопределите AsyncTask.onProgressUpdate ().

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

  • Кроме того, ваш код не препятствует доступу обоих потоков к «menuEntries» одновременно. Самый простой способ исправить эту часть - переместить вызов setListAdapter () из onCreate () в onPostExecute ().
1 голос
/ 15 февраля 2010

Нашел проблему , получается, что в 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 вместо только крайних случаев: /

...