SlideShare ist ein Scribd-Unternehmen logo
1 von 25
Downloaden Sie, um offline zu lesen
ANDROID + SCALA
Iniciando o desenvolvimento	

Programação Reativa Funcional
AGENDA
• Por que Scala no Android?	

• Build System (SBT)	

• Scaloid	

• Macroid	

• FRP: RxJava + Scala vs. Scala.Rx	

• Dificuldades
POR QUE…
…Scala no Android?
FUN & BYE BYE BOILERPLATE
• Diversão!!! =]	

• Todas as vantagens do Scala sobre o Java	

• Sintaxe limpa para o paradigma reativo funcional,
que requer funções de ordem superior	

• Diminuir código “boilerplate” necessário no Android
FRP: JAVAVS. SCALA
EditText message = (EditText)findViewById(R.id.message);
final TextView charCount = (TextView)findViewById(R.id.char_count);
Events.text(message).subscribe(new Action1<String>() {
@Override
public void call(String str) {
charCount.setText(String.valueOf(str.length()));
}
});
val message = find[EditText](R.id.message)
val charCount = find[TextView](R.id.char_count)
Events.text(message).subscribe((str: String) =>
charCount.setText(str.length.toString))
Java
Scala
ESTAMOS EM 2014!
ESTAMOS EM 2014!
Mas ainda com return
SBT
• Padrão para o Scala	

• Convention over configuration	

• Plugin maduro (02/2012) para Android:	

• https://github.com/pfn/android-sdk-plugin	

• Compatível com estrutura Ant ou Gradle
GRADLE + ANDROID
• Manter a estrutura exata do projeto Android
Studio	

• Plugin muito novo (02/2014) para Scala	

• https://github.com/saturday06/gradle-android-scala-plugin	

• Não funcionou nos meus testes
CRIANDO UM PROJETO
• Conforme recomendação do android-sdk-plugin,
usamos IntelliJ, criamos uma aplicação Android	

• Movemos o módulo app para a raiz	

• Criamos o build.sbt e 

project/plugings.sbt	
• Apagamos os arquivos gradle*
build.sbt
// so we can use keywords from Android, such as 'Android' and 'proguardOptions'
import android.Keys._
import android.Dependencies.{apklib,aar}
!
android.Plugin.androidBuild
!
name := "Reactive"
!
platformTarget in Android := "android-19"
!
versionCode in Android := Some(7)
!
versionName in Android := Some(“1.0")
!
proguardOptions in Android ++= Seq(
"-dontobfuscate",
"-dontoptimize",
"-dontwarn android.**",
"-dontwarn com.android.**"
)
!
libraryDependencies ++= Seq(
"org.scaloid" %% "scaloid" % "3.2.1-8",
"com.android.support" % "appcompat-v7" % "19.1.0"
)
project/plugins.sbt
addSbtPlugin("com.hanhuy.sbt" % "android-sdk-plugin" % "1.2.17")
!
addSbtPlugin("com.github.mpeltonen" % "sbt-idea" % "1.6.0")
project/build.properties
sbt.version=0.13.1
SCALOID
• Biblioteca para Android em Scala	

• Facilitar a vida tirando bastante boilerplate	

• Sugere a criação de layouts em Scala	

• Eu não gosto desse approach, por enquanto	

• Muitos implicits
SCALOID: EXEMPLOS
Button send = (Button)findViewById(R.id.send);
send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(SecondActivity.this, "Clique!", Toast.LENGTH_SHORT).show();
}
});
val send = find[Button](R.id.send)
send.onClick(toast("Clique!"))
Java sem Scaloid
Scala com Scaloid
SCALOID: LAYOUT
new SVerticalLayout {
STextView("Sign in").textSize(24.5 sp).<<.marginBottom(25 dip).>>
STextView("ID")
SEditText()
STextView("Password")
SEditText() inputType TEXT_PASSWORD
SButton("Sign in")
this += new SLinearLayout {
SButton("Help")
SButton("Sign up")
}
}.padding(20 dip)
MACROID
• Mesma ideia do layout em Scala	

• Implementado com macros	

• Ferramentas para ligar ao código da aplicação	

• UI Actions, Tweaks etc…	

• Melhor pensado que o Scaloid para interface	

• Mesmo assim não tem feedback imediato na IDE
http://macroid.github.io/
MACROID: LAYOUT
l[LinearLayout](
// set button caption
w[Button] <~ text("Click me"),
!
// set text and hide for the time being
w[TextView] <~ text("Hello!") <~ hide
!
// set layout orientation
) <~ vertical
FRP FTW!
• Comportamento do app é escrito de maneira declarativa	

• Ganhos tradicionais do paradigma funcional	

• Ações processadas através de funções	

• Estado intimamente ligado à UI	

• Funções puras são mais fáceis de testar que objetos
FRAMEWORKS DE FRP
• RxJava + Scala	

• https://github.com/Netflix/RxJava	

• Java puro	

• Funciona no Android sem Scala	

• Baseado em stream de eventos	

• Bindings para Scala
• Scala.Rx	

• https://github.com/lihaoyi/scala.rx	

• Scala puro	

• Funciona em Scala.JS	

• Baseado em valores	

• Projeto de um homem só
FRP:APLICAÇÃO
• Tudo o que for assíncrono	

• Eventos de UI	

• Acesso serviços locais / remotos	

• Quase tudo em um app…
CODE! CODE! CODE!
DIFICULDADES
• Não consegui integrar o “run” do IntelliJ com o comando do SBT	

• Sempre que alguma lib for trocada, é necessário rodar o sbt
gen-idea	
• Problemas com o Proguard	

• Ele é necessário inclusive em DEBUG	

• Problemas de método / classe não encontrada ao rodar
requerem um sbt clean
PERGUNTAS?
OBRIGADO!
TRABALHE COM SCALA
A Pinuts está contratando	

Quer trabalhar com scala?	

Fale comigo!
André Luiz Carvalho	

andre@pinuts.com.br	

@alcarv
RH da Pinuts	

rh@pinuts.com.br

Weitere ähnliche Inhalte

Ähnlich wie Scala no Android

Treze ferramentas/frameworks para desenvolvimento Android
Treze ferramentas/frameworks para desenvolvimento AndroidTreze ferramentas/frameworks para desenvolvimento Android
Treze ferramentas/frameworks para desenvolvimento AndroidAdriano Rocha
 
Treze ferramentas/frameworks para desenvolvimento android
Treze ferramentas/frameworks para desenvolvimento androidTreze ferramentas/frameworks para desenvolvimento android
Treze ferramentas/frameworks para desenvolvimento androidRicardo Longa
 
Persistência de Dados no SQLite com Room
Persistência de Dados no SQLite com RoomPersistência de Dados no SQLite com Room
Persistência de Dados no SQLite com RoomNelson Glauber Leal
 
TDC2016 Boas Práticas SQL em Banco Relacional para Desenvolvedores
TDC2016 Boas Práticas SQL em Banco Relacional para DesenvolvedoresTDC2016 Boas Práticas SQL em Banco Relacional para Desenvolvedores
TDC2016 Boas Práticas SQL em Banco Relacional para DesenvolvedoresFernando Franquini
 
Evento Front End SP - Organizando o Javascript
 Evento Front End SP - Organizando o Javascript Evento Front End SP - Organizando o Javascript
Evento Front End SP - Organizando o JavascriptMichel Ribeiro
 
Curso de Introdução ao Android Básico
Curso de Introdução ao Android BásicoCurso de Introdução ao Android Básico
Curso de Introdução ao Android BásicoLuiz Carvalho
 
Migrations for Java (Javou #4 - JavaCE)
Migrations for Java (Javou #4 - JavaCE)Migrations for Java (Javou #4 - JavaCE)
Migrations for Java (Javou #4 - JavaCE)Rafael Ponte
 
Grails parte 1 - introdução
Grails   parte 1 - introduçãoGrails   parte 1 - introdução
Grails parte 1 - introduçãoJosino Rodrigues
 
RxJava - Programação assíncrona para Android.
RxJava - Programação assíncrona para Android.RxJava - Programação assíncrona para Android.
RxJava - Programação assíncrona para Android.Clerton Leal
 
MongoDB: um banco de dados orientado a documento
MongoDB: um banco de dados orientado a documentoMongoDB: um banco de dados orientado a documento
MongoDB: um banco de dados orientado a documentoJulio Monteiro
 
Introdução ao ASP.NET 3.5 - Campus Party Brasil 2009
Introdução ao ASP.NET 3.5 - Campus Party Brasil 2009Introdução ao ASP.NET 3.5 - Campus Party Brasil 2009
Introdução ao ASP.NET 3.5 - Campus Party Brasil 2009Ramon Durães
 
Ecosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javJulio Viegas
 
Desenvolvimento de um CRUD utilizando Stored Procedure
Desenvolvimento de um CRUD utilizando Stored ProcedureDesenvolvimento de um CRUD utilizando Stored Procedure
Desenvolvimento de um CRUD utilizando Stored ProcedureFernando Roberto Proença
 

Ähnlich wie Scala no Android (20)

Treze ferramentas/frameworks para desenvolvimento Android
Treze ferramentas/frameworks para desenvolvimento AndroidTreze ferramentas/frameworks para desenvolvimento Android
Treze ferramentas/frameworks para desenvolvimento Android
 
Treze ferramentas/frameworks para desenvolvimento android
Treze ferramentas/frameworks para desenvolvimento androidTreze ferramentas/frameworks para desenvolvimento android
Treze ferramentas/frameworks para desenvolvimento android
 
Persistência de Dados no SQLite com Room
Persistência de Dados no SQLite com RoomPersistência de Dados no SQLite com Room
Persistência de Dados no SQLite com Room
 
TDC2016 Boas Práticas SQL em Banco Relacional para Desenvolvedores
TDC2016 Boas Práticas SQL em Banco Relacional para DesenvolvedoresTDC2016 Boas Práticas SQL em Banco Relacional para Desenvolvedores
TDC2016 Boas Práticas SQL em Banco Relacional para Desenvolvedores
 
Evento Front End SP - Organizando o Javascript
 Evento Front End SP - Organizando o Javascript Evento Front End SP - Organizando o Javascript
Evento Front End SP - Organizando o Javascript
 
Introdução ao JavaFX
Introdução ao JavaFXIntrodução ao JavaFX
Introdução ao JavaFX
 
Curso de Introdução ao Android Básico
Curso de Introdução ao Android BásicoCurso de Introdução ao Android Básico
Curso de Introdução ao Android Básico
 
Migrations for Java (Javou #4 - JavaCE)
Migrations for Java (Javou #4 - JavaCE)Migrations for Java (Javou #4 - JavaCE)
Migrations for Java (Javou #4 - JavaCE)
 
Grails parte 1 - introdução
Grails   parte 1 - introduçãoGrails   parte 1 - introdução
Grails parte 1 - introdução
 
Dinamizando Sites Estáticos
Dinamizando Sites EstáticosDinamizando Sites Estáticos
Dinamizando Sites Estáticos
 
Minicurso groovy grails
Minicurso groovy grailsMinicurso groovy grails
Minicurso groovy grails
 
Explorando a API Rest Jira Cloud
Explorando a API Rest Jira CloudExplorando a API Rest Jira Cloud
Explorando a API Rest Jira Cloud
 
RxJava - Programação assíncrona para Android.
RxJava - Programação assíncrona para Android.RxJava - Programação assíncrona para Android.
RxJava - Programação assíncrona para Android.
 
Relatório
RelatórioRelatório
Relatório
 
MongoDB: um banco de dados orientado a documento
MongoDB: um banco de dados orientado a documentoMongoDB: um banco de dados orientado a documento
MongoDB: um banco de dados orientado a documento
 
Introdução ao ASP.NET 3.5 - Campus Party Brasil 2009
Introdução ao ASP.NET 3.5 - Campus Party Brasil 2009Introdução ao ASP.NET 3.5 - Campus Party Brasil 2009
Introdução ao ASP.NET 3.5 - Campus Party Brasil 2009
 
Vb
VbVb
Vb
 
Ecosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_jav
 
DDD > Experiências
DDD > ExperiênciasDDD > Experiências
DDD > Experiências
 
Desenvolvimento de um CRUD utilizando Stored Procedure
Desenvolvimento de um CRUD utilizando Stored ProcedureDesenvolvimento de um CRUD utilizando Stored Procedure
Desenvolvimento de um CRUD utilizando Stored Procedure
 

Scala no Android

  • 1. ANDROID + SCALA Iniciando o desenvolvimento Programação Reativa Funcional
  • 2. AGENDA • Por que Scala no Android? • Build System (SBT) • Scaloid • Macroid • FRP: RxJava + Scala vs. Scala.Rx • Dificuldades
  • 4. FUN & BYE BYE BOILERPLATE • Diversão!!! =] • Todas as vantagens do Scala sobre o Java • Sintaxe limpa para o paradigma reativo funcional, que requer funções de ordem superior • Diminuir código “boilerplate” necessário no Android
  • 5. FRP: JAVAVS. SCALA EditText message = (EditText)findViewById(R.id.message); final TextView charCount = (TextView)findViewById(R.id.char_count); Events.text(message).subscribe(new Action1<String>() { @Override public void call(String str) { charCount.setText(String.valueOf(str.length())); } }); val message = find[EditText](R.id.message) val charCount = find[TextView](R.id.char_count) Events.text(message).subscribe((str: String) => charCount.setText(str.length.toString)) Java Scala
  • 7. ESTAMOS EM 2014! Mas ainda com return
  • 8. SBT • Padrão para o Scala • Convention over configuration • Plugin maduro (02/2012) para Android: • https://github.com/pfn/android-sdk-plugin • Compatível com estrutura Ant ou Gradle
  • 9. GRADLE + ANDROID • Manter a estrutura exata do projeto Android Studio • Plugin muito novo (02/2014) para Scala • https://github.com/saturday06/gradle-android-scala-plugin • Não funcionou nos meus testes
  • 10. CRIANDO UM PROJETO • Conforme recomendação do android-sdk-plugin, usamos IntelliJ, criamos uma aplicação Android • Movemos o módulo app para a raiz • Criamos o build.sbt e 
 project/plugings.sbt • Apagamos os arquivos gradle*
  • 11. build.sbt // so we can use keywords from Android, such as 'Android' and 'proguardOptions' import android.Keys._ import android.Dependencies.{apklib,aar} ! android.Plugin.androidBuild ! name := "Reactive" ! platformTarget in Android := "android-19" ! versionCode in Android := Some(7) ! versionName in Android := Some(“1.0") ! proguardOptions in Android ++= Seq( "-dontobfuscate", "-dontoptimize", "-dontwarn android.**", "-dontwarn com.android.**" ) ! libraryDependencies ++= Seq( "org.scaloid" %% "scaloid" % "3.2.1-8", "com.android.support" % "appcompat-v7" % "19.1.0" )
  • 12. project/plugins.sbt addSbtPlugin("com.hanhuy.sbt" % "android-sdk-plugin" % "1.2.17") ! addSbtPlugin("com.github.mpeltonen" % "sbt-idea" % "1.6.0") project/build.properties sbt.version=0.13.1
  • 13. SCALOID • Biblioteca para Android em Scala • Facilitar a vida tirando bastante boilerplate • Sugere a criação de layouts em Scala • Eu não gosto desse approach, por enquanto • Muitos implicits
  • 14. SCALOID: EXEMPLOS Button send = (Button)findViewById(R.id.send); send.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(SecondActivity.this, "Clique!", Toast.LENGTH_SHORT).show(); } }); val send = find[Button](R.id.send) send.onClick(toast("Clique!")) Java sem Scaloid Scala com Scaloid
  • 15. SCALOID: LAYOUT new SVerticalLayout { STextView("Sign in").textSize(24.5 sp).<<.marginBottom(25 dip).>> STextView("ID") SEditText() STextView("Password") SEditText() inputType TEXT_PASSWORD SButton("Sign in") this += new SLinearLayout { SButton("Help") SButton("Sign up") } }.padding(20 dip)
  • 16. MACROID • Mesma ideia do layout em Scala • Implementado com macros • Ferramentas para ligar ao código da aplicação • UI Actions, Tweaks etc… • Melhor pensado que o Scaloid para interface • Mesmo assim não tem feedback imediato na IDE http://macroid.github.io/
  • 17. MACROID: LAYOUT l[LinearLayout]( // set button caption w[Button] <~ text("Click me"), ! // set text and hide for the time being w[TextView] <~ text("Hello!") <~ hide ! // set layout orientation ) <~ vertical
  • 18. FRP FTW! • Comportamento do app é escrito de maneira declarativa • Ganhos tradicionais do paradigma funcional • Ações processadas através de funções • Estado intimamente ligado à UI • Funções puras são mais fáceis de testar que objetos
  • 19. FRAMEWORKS DE FRP • RxJava + Scala • https://github.com/Netflix/RxJava • Java puro • Funciona no Android sem Scala • Baseado em stream de eventos • Bindings para Scala • Scala.Rx • https://github.com/lihaoyi/scala.rx • Scala puro • Funciona em Scala.JS • Baseado em valores • Projeto de um homem só
  • 20. FRP:APLICAÇÃO • Tudo o que for assíncrono • Eventos de UI • Acesso serviços locais / remotos • Quase tudo em um app…
  • 22. DIFICULDADES • Não consegui integrar o “run” do IntelliJ com o comando do SBT • Sempre que alguma lib for trocada, é necessário rodar o sbt gen-idea • Problemas com o Proguard • Ele é necessário inclusive em DEBUG • Problemas de método / classe não encontrada ao rodar requerem um sbt clean
  • 25. TRABALHE COM SCALA A Pinuts está contratando Quer trabalhar com scala? Fale comigo! André Luiz Carvalho andre@pinuts.com.br @alcarv RH da Pinuts rh@pinuts.com.br