scala no android
TRANSCRIPT
ANDROID + SCALAIniciando 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: JAVA VS. 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.propertiessbt.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: LAYOUTnew 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 SCALAA Pinuts está contratando
Quer trabalhar com scala?
Fale comigo!
André Luiz Carvalho [email protected] @alcarv
RH da Pinuts [email protected]