Scala Android AsyncTask赢得';t调用publishProgress回调,";onProgressUpdate“;

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

我在这上面花了太多时间,到目前为止,我仍然没有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,但没有看到发布进度回调(

代码

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