我花了太多时间在这上面并且我到目前为止还没有使用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
可悲的是,他们似乎都没有在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方法不需要声明返回类型和“=”).