Android, scala y eclipse = mezcla inestable
Recientemente, he escrito algunas aplicaciones para Android en scala, trabajando con Eclipse. Todo estaba bien hasta que mi programa sólo tenía varias clases / actividades. Cuando agregué más código, JVM empezó a fallar, eclipse a menudo congelado y adb perdió constantemente la conexión. Administrador de tareas mostró que el proceso de Java estaba tomando de 800 a 1300 MB de memoria!
Los parámetros de hardware de mi computadora son bastante agradables como i7 3rd gen, 8GB DDR3 y SSD 256. Así que no es la razón.
- Error al cargar CharSequence en Scala 2.11.4 y sbt 0.12.4
- Dependencia no resuelta en sbt-android-plugin 0.6.0-SNAPSHOT?
- Problema: "Extracción" de JSON usando ascensor-json en una aplicación Android (Scala)
- Alternativas a java en android
- Groovy, Scala, Clojure, etc scripts en Android
También mi software está actualizado y consits de la nueva versión de Eclipse, Android SDK, Scala y Java kit de desarrollo, todos los complementos para eclipse. -vmargs se configuran para el desarrollo scala pero no ayuda en absoluto. Así que lo eliminé como una causa del problema.
Cuando reescribo mi código a Java everythig va excelente y puedo seguir con mi proyecto.
¿Alguien ha encontrado alguna solución para trabajar con scala en el proyecto Android? He leído un par de temas similares aquí y en grupos de google, pero no hubo respuesta sobre esta cuestión.
EDITAR:
He perfilado mi código con visual vm, pero el uso de espacio en montón fue normal. He aquí un fragmento de mi código.
imports ... class MainActivity extends FragmentActivity { private lazy val timePicker = findViewById(R.id.timePicker).asInstanceOf[TimePicker] private lazy val spinner_sourceBank = findViewById(R.id.spinnerSource).asInstanceOf[Spinner] private lazy val spinner_targetBank = findViewById(R.id.spinnerDestination).asInstanceOf[Spinner] private lazy val myApplication = getApplication.asInstanceOf[MyApplication] private var ignoreTimeChange = false override protected def onCreate(savedInstanceState: Bundle) = { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) timePicker.setIs24HourView(true) initializeSpinner(spinner_sourceBank) initializeSpinner(spinner_targetBank) } private def initializeSpinner(spinner: Spinner) = { val adapter = ArrayAdapter.createFromResource(this, R.array.banks, R.layout.spinner_item) adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) spinner.setAdapter(adapter) } def reset(w: View) = { timePicker.setCurrentHour(13) timePicker.setCurrentMinute(00) spinner_sourceBank.setSelection(0) spinner_targetBank.setSelection(0) } def submit(w: View) = { if (spinner_sourceBank.getSelectedItemPosition == 0 || spinner_targetBank.getSelectedItemPosition == 0) { new AlertDialog.Builder(this).setPositiveButton("OK", new OnClickListener { override def onClick(dialog: DialogInterface, which: Int) { dialog dismiss } }).setMessage(getString(R.string.alert_title)).setTitle("Alert Dialog").setIcon(android.R.drawable.ic_dialog_alert).create.show } else manageFragments(sourceBank, targetBank) } def manageFragments(sourceBank: String, targetBank: String) = { val fragmentTransaction = getSupportFragmentManager.beginTransaction if (targetBank == sourceBank) myApplication.setCurrentFragment(MyApplication.NOW) else myApplication.setCurrentFragment(MyApplication.FIRST_SESSION) fragmentTransaction.replace(R.id.fragment_container, myApplication.getCurrentFragment) fragmentTransaction.commit } override def onCreateOptionsMenu(menu: Menu): Boolean = { getMenuInflater.inflate(R.menu.activity_main, menu); true } }
Podría probar mi aplicación en un dispositivo móvil y funcionó bastante bien. También podría escribir mi código, pero eclipse se comportó como funcionó en la vieja computadora – las lengüetas de la conmutación tomaron mucho tiempo y así que construyendo y desplegando.
- Modo correcto de usar YouTube.Builder
- Uso de Scala con Java en Android Studio
- ¿Es Scala para mí? (Desarrollador C # con enfoque en el estilo funcional / OOP)
- Uso de constantes Java desde Scala en Android
- IntelliJ Idea 12 + Android + Scala hoy en día
- ¿Cómo extender ImageView en una aplicación Android Scala?
- Aplicación IntelliJ IDEA android scala
- Android / Scala proyecto en IntelliJ 14 compila, pero se bloquea cuando se inicia no encontrar la clase Scala
Añádale a eclipse.ini (o edite si está presente), ya que están más optimizadas para el desarrollo de Scala: Deben aparecer debajo de entradas de eclipse, como -vm:
-Xverify:none -Dosgi.requiredJavaVersion=1.6 -Xms900m -Xmx900m -Xss2m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:MaxGCPauseMillis=20 -XX:MaxHeapFreeRatio=70 -XX:+ScavengeBeforeFullGC -XX:+UseParallelOldGC -XX:+UnlockExperimentalVMOptions -XX:+UseFastAccessorMethods -XX:ReservedCodeCacheSize=128m -XX:+TieredCompilation -XX:+AggressiveOpts
Probablemente improbable, pero si utiliza CMS GC, elimine las referencias del archivo.
Si bien no he hecho esto con el desarrollo específico de Android, he golpeado problemas similares mientras se hace el curso de "Principios de programación de funciones en Scala" Coursera. Lo que resultó ser era el espacio PermGen para el Eclipse JVM estaba maxing hacia fuera lo que provoca todo tipo de comportamiento Eclipse aleatorio y caótico. Resulta que detrás de las escenas, el compilador Scala genera MUCHAS más veces el número de archivos de clase que para un proyecto Java de aproximadamente el mismo tamaño. Por lo tanto, he añadido lo siguiente a la línea de comandos de inicio para Eclipse:
-XX: MaxPermSize = 256m
Antes de esto, yo estaba teniendo los más extraños errores de Eclipse, en los momentos más extraños, sin ninguna forma razonable de reproducirlos consistentemente. Y tuve esto durante las primeras tres semanas del curso. Casi salí del curso desde que estaba usando la versión de TypeSafe de Eclipse que había descargado explícitamente para el curso. Una vez que agregué lo anterior a la puesta en marcha de JVM para Eclipse, no tuve otro problema. No podía creer lo impresionante que era el Scala IDE, ya que nunca había podido usarlo estable antes de hacer esto.
Espero que esto ayude.
- Android libgdx desliza la detección a la izquierda y la derecha mediante el uso de gesture listener
- Buscar en ListView con EditText