My experience with Scala on Android
用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又跑回來了,我這邊看到的狀況是
會被Scala compiler專換成
而底下的code,則是scala compiler會吐出 overides nothing.
不管怎樣,都跟Android要求的
解決方法是在 java 裡寫個 bridge interface ,幫 scala compiler 搞不定的東西,在這個 interface 裡定意好
我用的 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)));
}
}
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