Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Painless Android Development with Scala

Painless Android Development with Scala

A joint talk with @javielinux about #Scala as an alternative for better #Android Development where some common android development pitfalls are shown and how they can be solved with Scala.

Raúl Raja Martínez

January 31, 2015
Tweet

More Decks by Raúl Raja Martínez

Other Decks in Technology

Transcript

  1. 㱺 47 Degrees, a global consulting agency & Typesafe Consulting

    Partner. @raulraja @javielinux @47deg http://47deg.com/blog (Scala on Android) 㱺 Painless Android Development with Scala 2
  2. SBT 㱺 Android SDK Plugin — Supports all Android SDK

    tasks — dex — typedResourcesGenerator — proguard — buildConfigGenerator — (+ 20... more) (Scala on Android) 㱺 Painless Android Development with Scala 5
  3. SBT 㱺 Android SDK Plugin 㱺 typedResourcesGenerator object TR {

    val title = TypedResource[TextView](R.id.title) object layout { val abc_screen_toolbar = TypedLayout[ActionBarOverlayLayout](R.layout.abc_screen_toolbar) } } class MyActivity extends AppCompatActivity with TypedActivity { val titleTextView = findView(title) //titleTextView inferred as TextView, no casting needed } (Scala on Android) 㱺 Painless Android Development with Scala 6
  4. SBT 㱺 Android SDK Plugin 㱺 proguard Size Matters Scala

    byte code size reduced ~ (2.8M) (Scala on Android) 㱺 Painless Android Development with Scala 7
  5. SBT 㱺 Android SDK Plugin — https://github.com/pfn/android-sdk-plugin — Active —

    Fast (incremental compilation and proguard caching) — Proguard + MultiDexApplication integration (Circumvents 65K method limit) — Supports AAR, JAR and APK artifact types (Scala on Android) 㱺 Painless Android Development with Scala 8
  6. Java Vs Scala 㱺 NullPointerExceptions Person person = getPerson(); String

    name = null; if (person != null && person.getJob() != null) { name = person.getJob().getName(); } if (name != null) { return name; } else { return DEFAULT_NAME; } (Scala on Android) 㱺 Painless Android Development with Scala 9
  7. Java Vs Scala 㱺 NullPointerExceptions val jobName : Option[String] =

    person.job map (_.name) OR val jobName : Option[String] = for { job <- person.job } yield job.name OR Option, Try, Either, \/, Validation (Scala on Android) 㱺 Painless Android Development with Scala 10
  8. Java Vs Scala 㱺 Contexts public class MainActivity extends Activity

    { public void bar() { FooUtils.get(getContext(), R.string.name); } } public class FooUtils { static String get(Context c, int res) { return c.getString(res); } } (Scala on Android) 㱺 Painless Android Development with Scala 11
  9. Java Vs Scala 㱺 Contexts class MainActivity extends Activity {

    implicit val ctx = getApplicationContext def bar = FooUtils.get(R.string.name) } object FooUtils { def get(res : Int)(implicit ctx : Context) = { ctx.getString(res) } } (Scala on Android) 㱺 Painless Android Development with Scala 12
  10. Java Vs Scala 㱺 Contexts trait Contexts { self :

    Activity => implicit val appContext = getApplicationContext implicit val activityContext = this } class MainActivity extends Activity with Contexts { def bar = FooUtils.get(R.string.name) } object FooUtils { def get(res : Int)(implicit ctx : Context) = { ctx.getString(res) } } (Scala on Android) 㱺 Painless Android Development with Scala 13
  11. Java Vs Scala 㱺 Implicit Classes public class TextViewUtils {

    public void loadFont(TextView textView, String font) { textView.setFontType(font,...) } } TextViewUtils.loadFont(textView, "robotto"); (Scala on Android) 㱺 Painless Android Development with Scala 14
  12. Java Vs Scala 㱺 Implicit Classes object Helpers { implicit

    class TextViewHelpers(textView: TextView) { def loadFont(font: String) = ??? } } import Helpers._ textView.loadFont(“Roboto.ttf”) (Scala on Android) 㱺 Painless Android Development with Scala 15
  13. Java Vs Scala 㱺 Async public class MyTask1 extends AsyncTask<Void,

    Void, Integer> { protected Integer doInBackground(Void... v) { return r1; } protected void onPostExecute(Integer result) { new MyTask2().execute(result); } } public class MyTask2 extends AsyncTask<Integer, Void, Integer> { protected Integer doInBackground(Integer... r1) { return r2; } protected void onPostExecute(Integer result) { r1 + r2; } } new MyTask1().execute(); (Scala on Android) 㱺 Painless Android Development with Scala 16
  14. Java Vs Scala 㱺 Async def myTask1: Future[Int] = Future(1)

    def myTask2: Future[Int] = Future(2) def sumResponses: Future[Int] = for { r1 <- myTaks1 r2 <- myTaks2 } yield (r1 + r2) sumResponses map println (Scala on Android) 㱺 Painless Android Development with Scala 17
  15. Java Vs Scala 㱺 Async Future.reduce(List(Future(1), Future(2))) { (a, b)

    => a + b } (Scala on Android) 㱺 Painless Android Development with Scala 18
  16. Java Vs Scala 㱺 Async Future.reduce(List(Future(1), Future(2))) (_ + _)

    (Scala on Android) 㱺 Painless Android Development with Scala 19
  17. Java Vs Scala 㱺 Models public class Person { private

    String name; private String lastName; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } } (Scala on Android) 㱺 Painless Android Development with Scala 20
  18. Java Vs Scala 㱺 Models case class Person( name :

    String, lastName : String) (Scala on Android) 㱺 Painless Android Development with Scala 21
  19. Java Vs Scala 㱺 Pattern Matching public boolean onTouchEvent(MotionEvent ev)

    { ... switch (action) { case MotionEvent.ACTION_DOWN: ... break; case MotionEvent.ACTION_MOVE: ... break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: ... break; } } (Scala on Android) 㱺 Painless Android Development with Scala 22
  20. Java Vs Scala 㱺 Pattern Matching def onTouchEvent(ev: MotionEvent) {

    import MotionEvent._ action match { case ACTION_DOWN => ??? case ACTION_MOVE => ??? case ACTION_UP | ACTION_CANCEL => ??? } } (Scala on Android) 㱺 Painless Android Development with Scala 23
  21. Java Vs Scala 㱺 Pattern Matching person match { case

    Person(_, lastName) if lastName == “Pacheco” => println(“Guapetón”) case Person(name, _) if name == “Raúl” => println(“Resultón”) case _ => println(“Programadores Java”) } (Scala on Android) 㱺 Painless Android Development with Scala 24
  22. Java Vs Scala 㱺 Singletons public class MySingleton { private

    MySingleton(){} public synchronized static MySingleton getInstance() { if(instance == null) instance = new MySingleton (); return instance; } public void bar(){ ... } } (Scala on Android) 㱺 Painless Android Development with Scala 25
  23. Java Vs Scala 㱺 Singletons object MySingleton { def bar

    = ... } (Scala on Android) 㱺 Painless Android Development with Scala 26
  24. Java Vs Scala 㱺 Mixins class Mammal class PlatyPus extends

    Mammal new PlatyPus().eggs() <- Compilation Error!!! (Scala on Android) 㱺 Painless Android Development with Scala 27
  25. Java Vs Scala 㱺 Mixins trait Mammal trait EggsSupport {

    def eggs : Eggs } class PlatyPus extends Mammal with EggsSupport PlatyPus().eggs <- Success!!! (Scala on Android) 㱺 Painless Android Development with Scala 28