Android development with Scala

9,406
-1

Published on

slides from talk given at droidcamp Berlin, 2009

Published in: Technology
0 Comments
10 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
9,406
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
115
Comments
0
Likes
10
Embeds 0
No embeds

No notes for slide
  • Android development with Scala

    1. 1. Android development with Scala @jberkel
    2. 2. Scala? • a better, more modern Java • based on the JVM, Java (binary) compatible • multi-paradigm: functional, oop • soon mainstream? twitter, ebay...
    3. 3. better? • purer OO (no primitives) • less boilerplate ([gs]etter) • less code (type inference) • no checked exceptions • no 1:1 file - class mapping
    4. 4. type inference
    5. 5. Map<String,String> m = new HashMap<String,String>(); m.put("foo", "bar");
    6. 6. val m = Map("foo"- >"bar")
    7. 7. sound type checking which doesn’t get in your way
    8. 8. traits = fat interfaces
    9. 9. import android.util.Log trait LogHelper { def log(s: String) = Log.d(getClass.getSimpleName, s) def logException(e: Throwable) = Log.e(getClass.getSimpleName, "error", e) def withExceptionHandling(what: => Unit) { try { what } catch { case ex: Exception => logException(ex) } } }
    10. 10. import android.util.Log trait LogHelper { def log(s: String) = Log.d(getClass.getSimpleName, s) def logException(e: Throwable) = Log.e(getClass.getSimpleName, "error", e) def withExceptionHandling(what: => Unit) { try { what } catch { case ex: Exception => logException(ex) } } } what: passed in as function
    11. 11. class MyService extends android.app.Service with LogHelper { override def onCreate() { withExceptionHandling { log("about to run") doDangerousStuff(true) } } }
    12. 12. trait DbSupport { def getDb: android.database.sqlite.SQLiteDatabase def query[T](sql: String, args: String*)(fun: Cursor=>T) = { val cursor = getDb.rawQuery(sql, args.toArray[String]) try { fun(cursor) } finally { cursor.close } } } “loan pattern”
    13. 13. traits are “stackable”
    14. 14. class ServiceStack extends Service with DbSupport with LogHelper { // }
    15. 15. functional programming style
    16. 16. use functions instead of one-method interfaces !
    17. 17. locationManager.addGpsStatusListener( new GpsStatus.Listener { public void onGpsStatusChanged(int event) { System.out.println(event); } }) vs. locationManager.addGpsStatusListener(println(_))
    18. 18. pimp my library cursors
    19. 19. implicit def RichCursor(c: Cursor):RichCursor = new RichCursor(c) class RichCursor(underlying: Cursor) extends Iterable[Cursor] { override def elements = new Iterator[Cursor] { def hasNext = !underlying.isLast def next = { underlying.moveToNext() underlying } } } the trait Iterable provides find, map, filter etc.
    20. 20. query("select * from foo") { cursor => cursor.map { row => val v = new ContentValues DatabaseUtils.cursorRowToContentValues(row, v) v } }
    21. 21. XML handling
    22. 22. validate xml at compile time! val event = <event> <artists> <artist>Screaming Tea Party</artist> <artist>Ungdomskulen</artist> <artist>Invasion</artist> </artists> </event> val artists = (event "artist" "artists") .map(_.text).mkString(", ") inline XML with xpath style query operator
    23. 23. Problems • incomplete “convenience” layer • resulting APKs are big, use proguard • not many tools / experienced devs • fewer libraries, but growing
    24. 24. Programming in Scala
    25. 25. Scala for Java Refugees, D. Spiewak • http://www.codecommit.com/ blog/scala/roundup-scala-for-java- refugees
    26. 26. Community • scala-lang.org, #scala • very responsive & helpful • growing the language is a community effort
    27. 27. • eclipse: http://www.novoda.com/ blog/?p=154 • simple-build-tools (sbt) http:// github.com/harrah/android-plugin • scala-android: http:// code.google.com/p/scala-android/
    1. A particular slide catching your eye?

      Clipping is a handy way to collect important slides you want to go back to later.

    ×