Scala Android AsyncTask不会调用publishProgress回调,“onProgressUpdate”

我花了太多时间在这上面并且我到目前为止还没有使用publishProgress()功能…幸运的是onPostExecute也在UI线程中运行所以我必须为我想要加载的每个图像创建N个线程更新列表视图的一个大线程.所以,不是致命的,而是真正的烦恼.

首先,这些页面的大thianks提供了更多的见解和方法[参考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这是一种解决方法:SAME AS ABOVE

(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,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,所以这有帮助.我只能说“现在学习SCALA!”…… XML支持非常棒,我原来的RSS解析代码(四个类!)现在在一个文件和大约80行代码中,使用XML API查找元素,提取属性等

祝一切顺利,
🙂

最佳答案 我刚尝试了类似的东西,并且遇到了和你一样的问题.

我用它解决了

将类定义为

class FeedLoaderTask(val activity: ActivityFeedReader)
  extends AsyncTask[AnyRef, AnyRef, Seq[FeedEntry]]

和我的onProgressUpdate为:

override def onProgressUpdate(params: AnyRef*) {
  val feeds = params(0).asInstanceOf[Seq[FeedEnty]]
  ...
}

如您所见,它类似于doInBackground()方法(请注意,您不一定需要在Scala中显式调用apply(),而void方法不需要声明返回类型和“=”).

点赞