Scala no Android

404 views
316 views

Published on

Iniciando o desenvolvimento em Scala no Android.

Published in: Software
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
404
On SlideShare
0
From Embeds
0
Number of Embeds
15
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Scala no Android

  1. 1. ANDROID + SCALA Iniciando o desenvolvimento Programação Reativa Funcional
  2. 2. AGENDA • Por que Scala no Android? • Build System (SBT) • Scaloid • Macroid • FRP: RxJava + Scala vs. Scala.Rx • Dificuldades
  3. 3. POR QUE… …Scala no Android?
  4. 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. 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
  6. 6. ESTAMOS EM 2014!
  7. 7. ESTAMOS EM 2014! Mas ainda com return
  8. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 20. FRP:APLICAÇÃO • Tudo o que for assíncrono • Eventos de UI • Acesso serviços locais / remotos • Quase tudo em um app…
  21. 21. CODE! CODE! CODE!
  22. 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
  23. 23. PERGUNTAS?
  24. 24. OBRIGADO!
  25. 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

×