Android
development with
      Scala


                   @jberkel
Scala?
• a better, more modern Java
• based on the JVM, Java (binary)
 compatible
• multi-paradigm: functional, oop
• soon...
better?
• purer OO (no primitives)
• less boilerplate ([gs]etter)
• less code (type inference)
• no checked exceptions
• n...
type
inference
Map<String,String> m =
  new HashMap<String,String>();
m.put("foo", "bar");
val m = Map("foo"-
>"bar")
sound type checking which
  doesn’t get in your way
traits = fat interfaces
import android.util.Log

trait LogHelper {

 def log(s: String) = Log.d(getClass.getSimpleName, s)
 def logException(e: Th...
import android.util.Log

trait LogHelper {

 def log(s: String) = Log.d(getClass.getSimpleName, s)
 def logException(e: Th...
class MyService extends android.app.Service
 with LogHelper {

    override def onCreate() {
      withExceptionHandling {...
trait DbSupport {
  def getDb: android.database.sqlite.SQLiteDatabase

    def query[T](sql: String, args: String*)(fun: C...
traits are “stackable”
class ServiceStack extends Service
  with DbSupport with LogHelper {
  //
}
functional programming style
use functions instead of one-method
             interfaces !
locationManager.addGpsStatusListener(
  new GpsStatus.Listener {
   public void onGpsStatusChanged(int event) {
     Syste...
pimp my library



     cursors
implicit def RichCursor(c: Cursor):RichCursor = new RichCursor(c)

class RichCursor(underlying: Cursor) extends Iterable[C...
query("select * from foo") { cursor =>
  cursor.map { row =>
    val v = new ContentValues
    DatabaseUtils.cursorRowToCo...
XML handling
validate xml at compile time!

val event = <event>
 <artists>
  <artist>Screaming Tea Party</artist>
  <artist>Ungdomskule...
Problems
• incomplete “convenience” layer
• resulting APKs are big, use
 proguard
• not many tools / experienced
 devs
• f...
Programming in Scala
Scala for Java Refugees,
        D. Spiewak

• http://www.codecommit.com/
 blog/scala/roundup-scala-for-java-
 refugees
Community

• scala-lang.org, #scala
• very responsive & helpful
• growing the language is a
 community effort
• eclipse: http://www.novoda.com/
 blog/?p=154
• simple-build-tools (sbt) http://
 github.com/harrah/android-plugin
• scal...
Upcoming SlideShare
Loading in...5
×

Android development with Scala

9,184

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,184
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.

    ×