Scala Android AsyncTask赢得';t调用publishProgress回调,";onProgressUpdate“;
我在这上面花了太多时间,到目前为止,我仍然没有publishProgress()功能。。。幸运的是,onPostExecute也在UI线程中运行,因此我必须为每个要加载的图像创建N个线程,而不是一个更新listview的大线程。所以,这不是致命的,而是真正的烦恼 首先,这些页面提供了更多的见解和方法,使[参考文献2!]有一个纯Scala实现 (1) 这是一个解决方法:issues.scala-lang.org浏览SI-1459(新用户限于2个链接) (2) va.eu/2009/10/31/scala-on-android-101-proguard-xmlparser-and-function2asynctask是一个解决方案:同上 (三) 可悲的是,在Scala 2.8.1上,Android 2.2.2在虚拟机Ubuntu11.04上运行Android-x86,它们似乎都不适合我 这是我的实际代码,垃圾清除,只是基本的。。。如果有人能告诉我如何打回电话,我会非常高兴,因为现在还不是圣诞节。我花了几个小时在这个问题上,根本无法让它工作,我尝试了“Progress”类型的每一种变体,因为使用AnyRef实际上可以工作,但任何其他类型都不能作为“Params”类型工作,有关该类型的详细信息,请参见上面的(2) 唉,我得到了preExecute(未显示)、doInBackground和postExecute,但没有看到发布进度回调( 代码Scala Android AsyncTask赢得';t调用publishProgress回调,";onProgressUpdate“;,android,scala,Android,Scala,我在这上面花了太多时间,到目前为止,我仍然没有publishProgress()功能。。。幸运的是,onPostExecute也在UI线程中运行,因此我必须为每个要加载的图像创建N个线程,而不是一个更新listview的大线程。所以,这不是致命的,而是真正的烦恼 首先,这些页面提供了更多的见解和方法,使[参考文献2!]有一个纯Scala实现 (1) 这是一个解决方法:issues.scala-lang.org浏览SI-1459(新用户限于2个链接) (2) va.eu/2009/10/31/sc
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...
}
}
}
私有类FeedLoaderTask(val活动:ActivityFeedReader)
扩展android.os.AsyncTask[AnyRef,Seq[FeedEntry],Seq[FeedEntry]]
{
/**@简短对话以显示我们的进度*/
私有变量dlgBusy:ProgressDialog=null;
覆盖def onPreExecute(){
dlgBusy=ProgressDialog.show(…)
}
覆盖受保护的def doInBackground(参数:AnyRef*):Seq[FeedEntry]={
//出于上述原因,求助于AnyRef
val url=params.apply(0).asInstanceOf[String]
log.d(“FeedLoaderTask:doInBackground:+url”)
val feeds=新的FeedReader(url).extract
log.d(“找到了,总数:+feed.length)
publishProgress()//feeds)//messageAndTerminate(R.string.rss\u failed\u msg)
案例=>
listAdapter=新的FeedListAdapter(…)
activity.setListAdapter(listAdapter)
…诸如此类的代码。。。
}
}
}
所以,我有一个解决办法(也许是更好的方法)来做我想做的事,但我讨厌不能做我想做的事
这将是一个很好的解决,因为它打败了我。。。这是我的第一个Android应用程序,有一次我几乎用Java完成了它,但我对所有的打字和粗制滥造感到非常厌烦,所以我从头开始,同时自学Scala。我认识Erlang、LISP和Haskell,所以这很有帮助。我能说的就是“现在就学习SCALA!”。。。XML支持非常棒,我最初的RSS解析代码(四个类!)现在位于一个文件中,大约80行代码,使用XMLAPI查找元素、提取属性等
祝你一切顺利,
:)受保护的覆盖def onProgressUpdate(进度:Seq[FeedEntry]*){ } 您可能希望将AsyncTask指定为AsyncTask[AnyRef,FeedEntry,Seq[FeedEntry]] 所以你可以
受保护的覆盖def onProgressUpdate(提要:提要条目*)
相反我只是尝试了一些类似的方法,结果遇到了与您相同的问题。 我和你一起解决了 将类定义为
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方法不需要声明返回类型和“=”。在参数和。。。。通过创建一个混合了两者的新java类,我可以实现以下结果:
import scala.collection.mutable.ArrayBuffer;
import android.os.AsyncTask;
public abstract class MyAsyncTask<U, V, W> extends AsyncTask<U, V, W> {
@Override
protected W doInBackground(U ... args) {
int count = args.length;
ArrayBuffer<U> res = new ArrayBuffer<U>(count);
for (int i = 0; i < count; i++) {
res.$plus$eq(args[i]);
}
return doInBackground1(res);
}
// Method to override in the scala file
protected abstract W doInBackground1(ArrayBuffer<U> args);
ArrayBuffer<V> res = new ArrayBuffer<V>();
@Override
protected void onProgressUpdate(V ... args) {
int count = args.length;
res.ensureSize(count);
res.clear();
ArrayBuffer<V> res = new ArrayBuffer<V>(count);
for (int i = 0; i < count; i++) {
res.$plus$eq(args[i]);
}
onProgressUpdate1(res);
}
// Method to override in the scala file
protected abstract void onProgressUpdate1(ArrayBuffer<V> args);
}
导入scala.collection.mutable.ArrayBuffer;
导入android.os.AsyncTask;
公共抽象类MyAsyncTask扩展了AsyncTask{
@凌驾
受保护的W DOIN背景(U…args){
int count=args.length;
ArrayBuffer res=新的ArrayBuffer(计数);
for(int i=0;i