Scala on Android

@jberkel
@jberkel
public class MyActivity extends android.app.Activity {
@Override public void onCreate(Bundle b) {
super.onCreate(b);
BatteryHelper.initialize(this);
}
}
trait BatteryAware extends Activity {
override def onCreate(b: Bundle) {
// register battery handler
}
override def onPause() { ... }
}
class MyActivity extends Activity
with BatteryAware
with Logger {
}
// database lookup
Cursor c = resolver.query(...);
List<MyModel> list = new ArrayList<MyModel>();
// iterate over rows and create objects
while (c != null && c.moveToNext()) {
list.add(MyModel.fromCursor(c));
}
if (c != null) c.close(); // release resource
return list;
class NiceCursor(c: Cursor) extends Iterable[Cursor] {
def iterator = new Iterator[Cursor] {
def hasNext = c.getCount > 0 && !c.isLast
def next() = { c.moveToNext(); c }
}
}
implicit def NiceCursor(c: Cursor) = new NiceCursor(c)
def query[T](uri: Uri)(fun: Cursor => T) = {
val cursor = resolver.query(uri)
try {
fun(cursor)
} finally {
cursor.close()
}
}
// that's better
val list = query(...)(_.map(MyModel.fromCursor(_)))
locationManager.addGpsStatusListener(
new GpsStatusListener() {
public void onGpsStatusChanged(int evt) {
System.out.printn(evt)
}
}
}
// vs.
locationManager.addGpsStatusListener(println(_))
github.com/pivotal/robolectric
github.com/jbrechtel/robospecs
lazy val track = ...
it should "insert an read back a track" in {
val uri = provider.insert(Content.TRACKS.uri,
track.buildContentValues())
val read = query(uri, 1)(_.map(new Track(_))).head
read.id should equal(track.id)
read.title should equal(track.title)
// etc.
}
However, Android developer guidelines say:
Avoid Creating Unnecessary Objects
But performance is improving (parallel GC, JIT etc)
$ ls -lh scala-library.jar
rw-r--r-- jan wheel 8.5M 24 May 2011 scala-library.jar
$ jar tfv scala-library.jar | wc -l
5480
public class Foo {
public static final Parcelable.Creator<Foo> CREATOR =
new Parcelable.Creator<Foo>() {
public Foo createFromParcel(Parcel in) {
return new Foo(in);
}
public Foo[] newArray(int size) {
return new Foo[size];
}
};
}
You cannot do this in Scala!
groups.google.com/forum/#!forum/scala-on-android jberkel.github.com/presentation-scala-on-android