Scala on-android

32
Scala on Android

description

Scala on Android: My Experience

Transcript of Scala on-android

Page 1: Scala on-android

Scala on Android

Page 2: Scala on-android

Android Development

● Write lots of Java code● Write UI and other resources in XML● Generate Java code from resources● Compile Java code into “.class” files● Run proguard● Compile class files to Dalvik Executable (DEX)● Deploy on device

Page 3: Scala on-android

Dalvik VM

● Does not support “.class” bytecode format● Can not use libraries which generate bytecode● Devices have limited CPU and Memory● Can not easily share libraries between

applications

Page 4: Scala on-android

Eclipse

● Has nice UI editors● IDE is a build tool

Page 5: Scala on-android

Alternative Languages for Android

Page 6: Scala on-android

Jython

● Does not have enough community support● Slow● Dynamic

Page 7: Scala on-android

JRuby

● Ruboto framework● Dynamic● Need to use java code generation

Page 8: Scala on-android

Clojure

● Very cool :)● Very slow start-up time● Sometimes need to generate bytecode

Page 9: Scala on-android

PHP

Who cares?

Page 10: Scala on-android

Rhino

● Nice language● Can run with optimization turned off● Completely interpreted● Dynamic

Page 11: Scala on-android

Groovy

???

Page 12: Scala on-android

Scala

● Statically typed● Compiled to Java bytecode● Has access to all classes in Android● Fast

● but sometimes slow :)

● Has SBT● Android● Maven artifacts

Page 13: Scala on-android

How to build Scala apps for Android

● ANT● Maven● SBT + Android Plugin

Page 14: Scala on-android

Little nice things about Scala

Page 15: Scala on-android

Type Inference

● Improve readability● Reduce number of imports● Less typing

Page 16: Scala on-android

val stream = getAssets().open("areas.json")

val stream: InputStream = getAssets().open("areas.json")

Page 17: Scala on-android

Import statement

import android.view.{

Window, Menu, MenuItem, KeyEvent, View

}

import android.util.Log.{e => error}

Page 18: Scala on-android

Lazy vals

lazy val searchBox =

findViewById(R.id.searchBox)

.asInstanceOf[AutoCompleteTextView]

Page 19: Scala on-android

Mixin Inheritance

class MainActivity extends MapActivity

with Logging

with DatabaseHelpers

with MapHelpers

Page 20: Scala on-android

Collections

● Best collection library I ever used● Sorry google-collections...

● Using arrays is easy● @specialized

Page 21: Scala on-android

Collection examples

val suggestions = areas map { _.name }

val index = areas.indexWhere(

_.name == searchString

)

val index =

areas.indexWhere(_.contains(coordinate))

pointList.minBy(_.lat)

Page 22: Scala on-android

First class functions

class AreaOverlay(

areas: Array[Area],

selectListener: Int => Unit

)

new AreaOverlay(

areas, this.onAreaSelected

)

Page 23: Scala on-android

Convert listeners into functions

implicit def fn2ClickListener(

f: View => Unit

): View.OnClickListener =

new View.OnClickListener() {

override def onClick(v: View) = f(view)

}

exitButton.setOnClickListener(

this.onExitClick

)

Page 24: Scala on-android

Files

● Directory structure is not forced to mirror packages

● Files can contain any amount of classes

Page 25: Scala on-android

Pattern matching

● No NPEs when using Option[T]● Easy to work with data objects

Page 26: Scala on-android

Pattern matching

lastLocation match {

case Some(c@Coordinate(lat, lon)) =>

...

case None =>

...

}

Page 27: Scala on-android

Implicits

implicit def coordinate2geopoint(

c: Coordinate

): GeoPoint = new GeoPoint(

c.lat * 1.0e6 toInt, c.lon * 1.0e6 toInt

)

Page 28: Scala on-android

XML

for (s <- xml \ "Document" \ "Style")

placemarkElem \ "Polygon" \

"outerBoundaryIs" \ "LinearRing" \

"coordinates"

Page 29: Scala on-android

Bad stuff

● Performance sensitive parts● Learn to use “javap”● Remove for-comprehensions and lambda functions● Do not use boxed types “by accident”

● Tools● UI Editor● Debugger● Build time (dex'ing of scala library)

Page 30: Scala on-android

What I missed from Java

● Google Guice● Maven● Good Eclipse integration● Feeling important...

Page 31: Scala on-android

Thank you!

Page 32: Scala on-android

Questions?