programming android application in scala

94
Programming Android Application in Scala BrianHsu / OSDC.2010

Upload: brian-hsu

Post on 06-May-2015

9.805 views

Category:

Technology


3 download

DESCRIPTION

Presentation at OSDC.tw 2010.

TRANSCRIPT

Page 1: Programming Android Application in Scala

Programming Android Application in Scala

BrianHsu / OSDC.2010

Page 2: Programming Android Application in Scala

關於我

Page 3: Programming Android Application in Scala

墳墓 (BrianHsu)

Page 4: Programming Android Application in Scala

表面上

軟體工程師

Page 5: Programming Android Application in Scala

實際上

萌系阿宅

Page 6: Programming Android Application in Scala

用萌化的手機

入侵藍星是也

Page 7: Programming Android Application in Scala

寫Andro

id

萌程式

     

是燃的

我最喜歡女

僕了!

我要讓手上機

全都是女僕!

Page 8: Programming Android Application in Scala

用 Java 寫程式卻燃不起來

Page 9: Programming Android Application in Scala

高手大師兄

Page 10: Programming Android Application in Scala

聽說高手都要精通 Multiple Language……

Page 11: Programming Android Application in Scala

ASE+Ruby/Python/Perl

Page 12: Programming Android Application in Scala

寫作Dynamic Scripting

Language

Page 13: Programming Android Application in Scala

唸作快、狠、準

Page 14: Programming Android Application in Scala

等等

Page 15: Programming Android Application in Scala

還要先裝 Runtime 啊?

Page 16: Programming Android Application in Scala

等等

Page 17: Programming Android Application in Scala

動態型別?

Page 18: Programming Android Application in Scala

執行期爆炸

def boom puts "Hello World"end

puts " 一個小小的 typo"booom

Page 19: Programming Android Application in Scala

結論

Page 20: Programming Android Application in Scala

我是懦夫不敢用 ASE

Page 21: Programming Android Application in Scala
Page 22: Programming Android Application in Scala

What is Scala?

Page 23: Programming Android Application in Scala

樓梯

Page 24: Programming Android Application in Scala

A Postfunctional Programming Language on Java Virtual Machine

Page 25: Programming Android Application in Scala

Compile toJVM .class Byte Code

Page 26: Programming Android Application in Scala

理論上

Full Java Interoperability

Page 27: Programming Android Application in Scala

可以直接拿來寫Android Application

Page 28: Programming Android Application in Scala

What is Scala?

Page 29: Programming Android Application in Scala

A Scalable Language

Page 30: Programming Android Application in Scala

會隨 User 變形的程式語言

Page 31: Programming Android Application in Scala

A Scalable Language

Page 32: Programming Android Application in Scala

A Scalable Language

Page 33: Programming Android Application in Scala

Why Scala?

Page 34: Programming Android Application in Scala
Page 35: Programming Android Application in Scala

三個願望一次滿足

Page 36: Programming Android Application in Scala

REPLScriptingCompiling

Page 37: Programming Android Application in Scala

REPL

Page 38: Programming Android Application in Scala

Scripting

Page 39: Programming Android Application in Scala

Compiling

Page 40: Programming Android Application in Scala

三個願望一次滿足

Page 41: Programming Android Application in Scala

Procedure

Object Oriented

Functional

Page 42: Programming Android Application in Scala

Procedure Programming

Page 43: Programming Android Application in Scala

Object Oriented Programming

Page 44: Programming Android Application in Scala

Functional Programming

Page 45: Programming Android Application in Scala

三個願望一次滿足

Page 46: Programming Android Application in Scala

Concise

Static Typing

Duck Typing

Page 47: Programming Android Application in Scala

Concise (Ruby)

Page 48: Programming Android Application in Scala

Concise (Scala)

Page 49: Programming Android Application in Scala

Static Typing (Ruby)

Page 50: Programming Android Application in Scala

Static Typing (Scala)

Page 51: Programming Android Application in Scala

真、 Duck Typing (Ruby)

Page 52: Programming Android Application in Scala

偽‧ Duck Typing (Scala)

Page 53: Programming Android Application in Scala

結論

Page 54: Programming Android Application in Scala

有 Scala 、無懦夫

Page 55: Programming Android Application in Scala

用Scala

寫萌程式

     

是燃的

我最喜歡女

僕了!

我要讓手上機

全都是女僕!

Page 56: Programming Android Application in Scala

Scala vs Java

Page 57: Programming Android Application in Scala

Scala compared to Java

Scala adds Scala removes+ a pure object system - static members+ operator overloading - primitive types+ closures - break, continue+ mixin composition with traits - special treatment of interfaces+ existential types - wildcards+ abstract types - raw types+ pattern matching - enums

Modeled in libraries: assert, enums, properties, events, actors, using, queries, …

Page 58: Programming Android Application in Scala

Scala cheat sheet (1): Definitions

Scala method definitions:

def fun(x: Int): Int = { result}

def fun = result

Scala variable definitions:

var x: Int = expressionval x: String = expression

Java method definition:

int fun(int x) { return result}

(no parameterless methods)

Java variable definitions:

int x = expressionfinal String x = expression

Page 59: Programming Android Application in Scala

Scala cheat sheet (2): Expressions

Scala method calls:

obj.meth(arg)obj meth arg

Scala choice expressions:

if (cond) expr1 else expr2

expr match { case pat1 => expr1 .... case patn => exprn

}

Java method call:

obj.meth(arg)(no operator overloading)

Java choice expressions, stmts:

cond ? expr1 : expr2 if (cond) return expr1; else return expr2;

switch (expr) { case pat1 : return expr1; ... case patn : return exprn ;} // statement only

Page 60: Programming Android Application in Scala

Scala cheat sheet (3): Objects and Classes

Scala Class and Object

class Sample(x: Int, val p: Int) { def instMeth(y: Int) = x + y}

object Sample { def staticMeth(x: Int, y: Int) = x * y}

Java Class with statics

class Sample { private final int x; public final int p; Sample(int x, int p) { this.x = x; this.p = p; } int instMeth(int y) { return x + y; } static int staticMeth(int x, int y) { return x * y; }}

Page 61: Programming Android Application in Scala

Scala cheat sheet (4): Traits

Scala Trait

trait T { def abstractMth(x: String): Int def concreteMth(x: String) = x + field var field = “!”}

Scala mixin composition:

class C extends Super with T

Java Interface

interface T { int abstractMth(String x)}

(no concrete methods)(no fields) Java extension + implementation:

class C extends Super implements T

Page 62: Programming Android Application in Scala

當機器人爬上樓梯

Page 63: Programming Android Application in Scala

Android Application開發流程

Page 64: Programming Android Application in Scala

Java / ANT

Page 65: Programming Android Application in Scala

$ android create project -p …$ vim .....$ ant install

Page 66: Programming Android Application in Scala

http://asantoso.wordpress.com/2009/09/15/how-to-build-android-application-package-apk-from-the-command-line-using-the-sdk-tools-continuously-integrated-using-cruisecontrol/

Page 67: Programming Android Application in Scala

http://asantoso.wordpress.com/2009/09/15/how-to-build-android-application-package-apk-from-the-command-line-using-the-sdk-tools-continuously-integrated-using-cruisecontrol/

Page 68: Programming Android Application in Scala

How?

Page 69: Programming Android Application in Scala

XML 地獄

ANT

Page 70: Programming Android Application in Scala

Perfect

SBT

Page 71: Programming Android Application in Scala

Simple Build Tool

Page 72: Programming Android Application in Scala

以 Scala 為Host Language

Page 73: Programming Android Application in Scala

Rake=>RubySBT =>Scala

Page 74: Programming Android Application in Scala

不用任何設定

支援連續編譯

Page 75: Programming Android Application in Scala

Android-Plugin

Page 76: Programming Android Application in Scala

android-pluginhttp://github.com/jberkel/android-plugin

project/build/MyProject.scala

Page 77: Programming Android Application in Scala

android-plugin

Page 78: Programming Android Application in Scala

我不會用

功能完整

Page 79: Programming Android Application in Scala

阿宅的通病

自己寫一個

Page 80: Programming Android Application in Scala

sbt-android

project/build/MyProject.scala

Page 81: Programming Android Application in Scala

sbt-android

project/plugins/Plugins.scala

Page 82: Programming Android Application in Scala

Live Demo

Page 83: Programming Android Application in Scala

Install SBT/SBT-Android

● Install SBT● http://code.google.com/p/simple-build-tool/

● Download SBT-Android● $ git clone http://github.com/brianhsu/sbt-android.git

● Install SBT-Android● $ cd sbt-android● $ sbt publish-local

Page 84: Programming Android Application in Scala

Create Android/Scala Project

● Create SBT project● $ mkdir AndroidTest● $ cd AndroidTest● $ sbt● Edit project/build/MyProject.scala● Edit project/plugins/Plugins.scala● $ sbt update

Page 85: Programming Android Application in Scala

Android/Scala Project Struture

Page 86: Programming Android Application in Scala

Build Scala/Android Project

● $ sbt action● $ sbt install

● $ sbt android-compile● $ sbt proguard● $ sbt zipalign● $ ...

Page 87: Programming Android Application in Scala

Scala in Android

Page 88: Programming Android Application in Scala

Trait 是好幫手

Page 89: Programming Android Application in Scala

SQL 再見!Collection 最高!

Page 90: Programming Android Application in Scala

善用偽 Duck Typing

Page 91: Programming Android Application in Scala

結論

可以把 Java 丟了……應該唄?

Page 92: Programming Android Application in Scala

等等,這是孔明的陷阱!

Page 93: Programming Android Application in Scala

Scala 的限制與臭蟲

● 限制● Cannot acess static protected Java field.

– 對不起, Google Maps API 用到了。

● 臭蟲● Static Java Inner class 造成 classfile borken /

missing dependcy– Google Maps API 踩到地雷了

● Cyclic dependcy– Google Data API 中計了– 以於 Scala 2.8 main trunk 中修正

● 解決方式● 用 Java 寫個 Wrapper 唄

Missing dependency

Page 94: Programming Android Application in Scala

Thanks!