我花了太多时间在这上面并且我到目前为止还没有使用publishProgress()功能...幸运的是onPostExecute也在UI线程中运行所以我必须为我想要的每个图像创建N个线程加载而不是一个更新列表视图的大线程。所以,不是致命的,而是一种真正的烦恼。
首先,为这些页面提供更多洞察力和方法[参考2!]的大thianks有一个纯粹的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这是一种解决方法:上面同样
可悲的是,他们似乎都没有在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完成了一次但我得到了如此令人讨厌的所有我从头开始打字和打字,同时自学Scala。我知道Erlang,LISP和Haskell,所以这有帮助。我只能说“现在学习SCALA!”...... XML支持非常棒,我原来的RSS解析代码(四个类!)现在在一个文件和大约80行代码中,使用XML API查找元素,提取属性等。
一切顺利, :)
答案 0 :(得分:2)
我只是尝试了类似的东西,并且和你一样遇到了同样的问题。 我用
解决了这个问题将类定义为
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方法不需要声明返回类型和“=”)
答案 1 :(得分:0)
protected override def onProgressUpdate(progress:Seq [FeedEntry] *){ }
您可能希望将AsyncTask指定为AsyncTask [AnyRef,FeedEntry,Seq [FeedEntry]]
所以你可以做到
受保护的覆盖def onProgressUpdate(feeds:FeedEntry *)
代替
答案 2 :(得分:0)
在参数和....之间进行转换很有用。通过创建一个混合两者的新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);
}