FileStream save async

7 views
Skip to first unread message

Diego Ponce de León

unread,
Sep 30, 2016, 8:52:14 AM9/30/16
to asnativos
Buenas, tengo una app con AIR que guarda muchos bitmaps en archivos de manera muy seguida. Los bitmaps se guardan con un bytearray tal cuál, sin encoding (no me hace falta), pero ese no es el caso. 
El problema que tengo es que en dispositivos lentos (esto en desktop ni se nota), la operación de guardar el archivo bloquea el UI thread, y necesito que esto no pase. En realidad basta con abrir el FileStream de modo asíncrono. 

Lo que no se bien y mi pregunta es cómo detectar cuándo se han escrito los bytes para cerrar el stream:

var stream:FileStream = new FileStream();
stream.openAsync(file, FileMode.WRITE);
stream.writeBytes(byteArray, 0, byteArray.length);

// Hack: we "openAysnc" to improve performance but if we close the stream right away, the file will become
// corrupt and will thow. Delaying the close call kind of fix it.
TweenMax.delayedCall(0.4, stream.close);
// stream.close();
Ahora estoy usando una ñapa con un timer, cerrando el stream pasando medio segundo, pero esto no sirve porque en dispositivos lentos puede tardar más. 

Es todo bastante extraño, porque stream.writeBytes() es un método síncrono, pero al abrir el stream con openAsync(), el stream.close() puede dejar el archivo corrupto, lo cuál quiere decir que los bytes no se han escrito correctamente.

Salud

Rodrigo Erades

unread,
Sep 30, 2016, 9:22:48 AM9/30/16
to asna...@googlegroups.com
Hola Diego:

La verdad es que no tengo ni puta idea, pero viendo la documentación de FileStream veo que tiene una propiedad de lectura que se llama  bytesAvailable Supongo que podrás meter un callback y cuando esa propiedad sea 0 es que ya no hay más que leer y puedes cerrar el stream de forma segura.

A lo mejor suena la flauta  ...

--
--
-----------------------------------------------------------------------
ASNativos
www.asnativos.com
-----------------------------------------------------------------------

---
Has recibido este mensaje porque estás suscrito al grupo "ASNativos - Lista de Actionscript" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a asnativos+unsubscribe@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.



--

Rodrigo Erades



Rodrigo Erades

unread,
Sep 30, 2016, 9:29:35 AM9/30/16
to asna...@googlegroups.com
También veo que FileStream extiende de EventDispatcher y podrías escuchar eventos:

var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt"); 
var myFileStream:FileStream = new FileStream(); 
myFileStream.addEventListener(Event.COMPLETE, completeHandler); 
myFileStream.addEventListener(ProgressEvent.PROGRESS, progressHandler); 
myFileStream.addEventListener(IOErrorEvent.IO_Error, errorHandler); 
myFileStream.open(myFile, FileMode.READ); 
 
function completeHandler(event:Event):void { 
    // ... 
} 
 
function progressHandler(event:ProgressEvent):void { 
    // ... 
} 
 
function errorHandler(event:IOErrorEvent):void { 
    // ... 
} 
--

Rodrigo Erades



Diego Ponce de León

unread,
Sep 30, 2016, 9:55:46 AM9/30/16
to asna...@googlegroups.com
Había visto los eventos pero me dio la impresión que el complete y el progress eran para operaciones de lectura, más que nada porque todos los ejemplos de código que he visto lo utilizan para eso.
Voy a probar todos y ver si dan algún resultado.

Gracias Rodrigo

Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a asnativos+...@googlegroups.com.

Para acceder a más opciones, visita https://groups.google.com/d/optout.



--

Rodrigo Erades






--

Rodrigo Erades



--
--
-----------------------------------------------------------------------
ASNativos
www.asnativos.com
-----------------------------------------------------------------------

---
Has recibido este mensaje porque estás suscrito al grupo "ASNativos - Lista de Actionscript" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a asnativos+...@googlegroups.com.

Diego Ponce de León

unread,
Sep 30, 2016, 10:25:08 AM9/30/16
to asna...@googlegroups.com
Vale, ya lo he conseguido: https://gist.github.com/xleon/bfbc9f973b9960fdb35dbc0f79c805cf
El evento era "OutputProgressEvent.OUTPUT_PROGRESS"

Gracias otra vez

Octavio Molano Anta

unread,
Sep 30, 2016, 1:40:49 PM9/30/16
to asna...@googlegroups.com
He llegado tarde a leer esto, pero sí, es OUTPUT_PROGRESS lo que buscabas. Yo necesité hacer esto hace unos años (descargar múltiples ficheros seguidos) y usé ese evento para controlar el progreso, pero también hice otra cosa que es guardar el fichero asíncronamente mientras se descarga el siguiente en memoria, para ahorrar algo de tiempo al usuario (aunque realmente sólo se nota con ficheros grandes). Te paso la clase por si te sirve.

Saludos,
Octavio

El 30 de septiembre de 2016, 14:51, Diego Ponce de León <mala...@gmail.com> escribió:
Buenas, tengo una app con AIR que guarda muchos bitmaps en archivos de manera muy seguida. Los bitmaps se guardan con un bytearray tal cuál, sin encoding (no me hace falta), pero ese no es el caso. 
El problema que tengo es que en dispositivos lentos (esto en desktop ni se nota), la operación de guardar el archivo bloquea el UI thread, y necesito que esto no pase. En realidad basta con abrir el FileStream de modo asíncrono. 

Lo que no se bien y mi pregunta es cómo detectar cuándo se han escrito los bytes para cerrar el stream:

var stream:FileStream = new FileStream();
stream.openAsync(file, FileMode.WRITE);
stream.writeBytes(byteArray, 0, byteArray.length);

// Hack: we "openAysnc" to improve performance but if we close the stream right away, the file will become
// corrupt and will thow. Delaying the close call kind of fix it.
TweenMax.delayedCall(0.4, stream.close);
// stream.close();
Ahora estoy usando una ñapa con un timer, cerrando el stream pasando medio segundo, pero esto no sirve porque en dispositivos lentos puede tardar más. 

Es todo bastante extraño, porque stream.writeBytes() es un método síncrono, pero al abrir el stream con openAsync(), el stream.close() puede dejar el archivo corrupto, lo cuál quiere decir que los bytes no se han escrito correctamente.

Salud
--
--
-----------------------------------------------------------------------
ASNativos
www.asnativos.com
-----------------------------------------------------------------------

---
Has recibido este mensaje porque estás suscrito al grupo "ASNativos - Lista de Actionscript" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a asnativos+unsubscribe@googlegroups.com.

Para acceder a más opciones, visita https://groups.google.com/d/optout.



--

Rodrigo Erades






--

Rodrigo Erades



--
--
-----------------------------------------------------------------------
ASNativos
www.asnativos.com
-----------------------------------------------------------------------

---
Has recibido este mensaje porque estás suscrito al grupo "ASNativos - Lista de Actionscript" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a asnativos+unsubscribe@googlegroups.com.

Para acceder a más opciones, visita https://groups.google.com/d/optout.
--
--
-----------------------------------------------------------------------
ASNativos
www.asnativos.com
-----------------------------------------------------------------------

---
Has recibido este mensaje porque estás suscrito al grupo "ASNativos - Lista de Actionscript" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a asnativos+unsubscribe@googlegroups.com.
AssetDownloader.as

Diego Ponce de León

unread,
Sep 30, 2016, 2:42:35 PM9/30/16
to asna...@googlegroups.com
Gracias tio, en mi caso no descargo ningún archivo, la app genera los bitmaps mientras dibujas. Toda esta movida es solo para implementar el paso atrás (igual que control-z).
Y el problema que me acabo de encontrar es que si tengo más de dos FileStream abiertos y guardando datos en paralelo, el primero y el segundo fallan y nunca termina. Así que ahora estoy implementando un cola para solo existan dos en paralelo como máximo.
Madre mía cómo echo en falta async/await de C#. AS == KK

Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a asnativos+...@googlegroups.com.

Para acceder a más opciones, visita https://groups.google.com/d/optout.



--

Rodrigo Erades






--

Rodrigo Erades



--
--
-----------------------------------------------------------------------
ASNativos
www.asnativos.com
-----------------------------------------------------------------------

---
Has recibido este mensaje porque estás suscrito al grupo "ASNativos - Lista de Actionscript" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a asnativos+...@googlegroups.com.

Para acceder a más opciones, visita https://groups.google.com/d/optout.
--
--
-----------------------------------------------------------------------
ASNativos
www.asnativos.com
-----------------------------------------------------------------------

---
Has recibido este mensaje porque estás suscrito al grupo "ASNativos - Lista de Actionscript" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a asnativos+...@googlegroups.com.

Para acceder a más opciones, visita https://groups.google.com/d/optout.

--
--
-----------------------------------------------------------------------
ASNativos
www.asnativos.com
-----------------------------------------------------------------------

---
Has recibido este mensaje porque estás suscrito al grupo "ASNativos - Lista de Actionscript" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a asnativos+...@googlegroups.com.

Hugo de León

unread,
Sep 30, 2016, 5:13:28 PM9/30/16
to asna...@googlegroups.com
BuenAS!

Yo usé esto hace tiempo para desktop y va genial, no sé qué tal funcionará en dispositivos móviles: http://www.bytearray.org/?p=4423

ASludos!

Agustin Quintanilla

unread,
Oct 3, 2016, 7:38:59 AM10/3/16
to asna...@googlegroups.com, Hugo de León
Gracias Hugo! al final resolvimos los problemas que limitan la carga de datos externos en local, creando un script que recorriera todos los datos externos, generando así un único archivo de datos y se lo chutamos como .as directamente... un poco a las duras, pero funcionó :D

saludos!
-- 
Agustin Quintanilla
Sent with Airmail
Reply all
Reply to author
Forward
0 new messages