Я потратил слишком много часов на это и до сих пор продолжаю жить без функции publishProgress () ... к счастью, onPostExecute также работает в потоке пользовательского интерфейса, поэтому мне пришлось создавать N потоков для каждого изображения, которое я хочу загрузить вместо одного большого потока, который должен был обновить просмотр списка. Так что не смертельно, а настоящее раздражение.
Прежде всего, большое спасибо этим страницам за предоставление более глубокого понимания и способов [ссылки 2!] Иметь чистую реализацию Scala ...
(1) http://blog.nelsonsilva.eu/2009/10/31/scala-on-android-101-proguard-xmlparser-and-function2asynctask, который является обходным путем для: Issues.scala-lang.org просмотра SI-1459 (Новые пользователи ограничены 2 ссылками)
(2) va.eu/2009/10/31/scala-on-android-101-proguard-xmlparser-and-function2asynctask, который является обходным решением для: ЖЕ КАК ВЫШЕ
(3) http://www.assembla.com/code/scala-eclipse-toolchain/git/nodes/docs/android-examples/android-sdk/Wiktionary/src/com/example/android/wiktionary/MyAsyncTask.java?rev=f2fdb3144d0225487cafc7d628adf64889772db4
К сожалению, ни один из них, похоже, не работал для меня на Scala 2.8.1 с Android 2.2.2 под управлением Android-x86 на Virtual Box, Ubuntu 11.04.
Вот мой реальный код, мусор удален, только самое необходимое ... если кто-нибудь может сказать мне, как вызвать обратный вызов, я буду очень счастлив, и это даже не Рождество. Я потратил часы на это и не могу заставить его работать вообще, я пробовал все варианты типа "Progress", поскольку использование AnyRef на самом деле работает, но любой другой тип не работает как тип "Params", см. ( 2) выше для деталей об этом.
Увы, я получаю preExecute (не показано), doInBackground и postExecute, но никаких обратных вызовов хода выполнения не видно. (
код ...
private class FeedLoaderTask(val activity: ActivityFeedReader)
extends android.os.AsyncTask[AnyRef, Seq[FeedEntry], Seq[FeedEntry]]
{
/** @brief dialog to show our progress */
private var dlgBusy:ProgressDialog = null;
override def onPreExecute() {
dlgBusy = ProgressDialog.show(...)
}
override protected def doInBackground(params: AnyRef*): Seq[FeedEntry] = {
// resorted to AnyRef for reasons explained above although
val url = params.apply(0).asInstanceOf[String]
log.d("FeedLoaderTask: doInBackground: " + url)
val feeds = new FeedReader(url).extract
log.d("Got them, total: " + feeds.length)
publishProgress()//feeds) // <--- seems to "call" but does not arrive
feeds
}
protected def onProgressUpdate(feeds: Seq[FeedEntry]): Void = {
// work damn you, WORK!
log.d("FeedLoaderTask: onProgressUpdate: " + feeds.length)
return null
}
override protected def onPostExecute (feeds: Seq[FeedEntry]) {
dlgBusy.dismiss()
dlgBusy = null
feeds.length match {
case 0 => messageAndTerminate(R.string.rss_failed_msg)
case _ =>
listAdapter = new FeedListAdapter(...)
activity.setListAdapter(listAdapter)
...blah blah more code...
}
}
}
Итак, у меня есть обходной путь (возможно, даже лучший способ) делать то, что я хочу, но я ненавижу не иметь возможности делать то, что я хочу.
Это было бы неплохо, чтобы было решено, так как его избили ... Это мое первое приложение для Android, и я почти однажды закончил его на Java, но мне так охренеть, что я набрал текст и бесполезность, которую я начал с нуля и одновременно научил себя Скале. Я знаю Erlang, LISP и Haskell, так что это помогло. Все, что я могу сказать, это «УЗНАЙТЕ СКАЛА СЕЙЧАС!» ... поддержка XML великолепна, мой оригинальный код синтаксического анализа RSS (четыре класса!) Теперь находится в одном файле и содержит около 80 строк кода, используя XML API для поиска элементов , извлечение атрибутов и т. д.
Всего наилучшего,
:)