用Scala開發Android,是個滿有趣的經驗,大致上來因為我切入的時間點較晚,所以大部份的問題已經被前人所解決,就用 https://github.com/jberkel/android-plugin 把專案用 sbt 開好後,就可以開始寫 android.

我用的 IDE 是 intellij 11 EAP,用 sbt-idea 把 idea project 設好後,把預設的 asset pa th 從 .idea_module 改成 src/main ,就可以開始開發了。


在開發上,除了前一回碰上的proguard問題外,我還碰上另一個比較嚴重的問題-不能在Scala裡寫 AsyncTask

這問題跟SI-3622 SI-3494有關,看來是在 Scala 2.8解掉的問題,2.9又跑回來了,我這邊看到的狀況是

override protected def doInBackground(params: Params*): Result

會被Scala compiler專換成
public Result doInBackground(Seq params)
public Result doInBackground(Params[] params)


而底下的code,則是scala compiler會吐出 overides nothing.
override protected def doInBackground(params: Array[Params]): Result

不管怎樣,都跟Android要求的protected Result doInBackground(Params[] params)不同,所以在runtime時會跑出NoSuchMethodError.

解決方法是在 java 裡寫個 bridge interface ,幫 scala compiler 搞不定的東西,在這個 interface 裡定意好

public abstract class SAsyncTask<Params, Progress, Result> extends AsyncTask<Params, Progress, Result> {

protected abstract Result doInBackground(Seq<Params> params);

@Override
protected Result doInBackground(Params... paramses) {
return doInBackground(JavaConversions.asScalaBuffer(Arrays.asList(paramses)));
}
}

Comments

yunglin
多補幾個有關repeated parameters的討論,看來是Spec本身有問題,然後實作時一改再改,一路從2.7開始修修補補過來

https://issues.scala-lang.org/browse/SI-1342
https://issues.scala-lang.org/browse/SI-1459
http://stackoverflow.com/questions/5512402/overriding-a-repeated-class-parameter-in-scala