gpt4 book ai didi

android - Scala Android AsyncTask 不会调用 publishProgress 回调, "onProgressUpdate"

转载 作者:太空宇宙 更新时间:2023-11-03 10:29:44 27 4
gpt4 key购买 nike

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

首先,非常感谢这些页面提供了更多见解和方法来 [引用 2!] 拥有纯 Scala 实现...

(1) http://blog.nelsonsilva.eu/2009/10/31/scala-on-android-101-proguard-xmlparser-and-function2asynctask这是一个解决方法:issues.scala-lang.org browse 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

遗憾的是,在 Virtual box、Ubuntu 11.04 上运行 Android-x86 的 Android 2.2.2 的 Scala 2.8.1 上,它们似乎都不适合我。

这是我的实际代码,删除了垃圾,只是必需品...如果有人能告诉我如何调用回调,我会非常高兴,而且现在还不是圣诞节。我在这上面花了几个小时,但根本无法让它工作,我尝试了“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 完成了一次,但我对所有这些感到厌烦打字和笨拙,我从头开始,同时自学 Scala。我了解 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 方法不需要声明返回类型和“=”) .

关于android - Scala Android AsyncTask 不会调用 publishProgress 回调, "onProgressUpdate",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7865449/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com