PDA

Ver la Versión Completa : [ CONSULTA ] Error en la lectura de un txt


monchyrcg
27/06/12, 18:15:09
Buenas tardes, tengo una aplicación que cojo un txt de la sd y lo leo todo funcionaba bien pero ahora me da un error. En realidad no es un error la aplicación cuando arranca se queda con la pantalla en negro así todo el tiempo, en el logcat no me aparece error solo una linea que pone:


06-27 17:40:57.527: I/dalvikvm(3610): Wrote stack traces to '/data/anr/traces.txt'


En el traces.txt aparece esto:

DALVIK THREADS:
(mutexes: tll=0 tsl=0 tscl=0 ghl=0 hwl=0 hwll=0)
"main" prio=5 tid=1 SUSPENDED
| group="main" sCount=1 dsCount=0 obj=0x400245c8 self=0xcfb8
| sysTid=3610 nice=0 sched=0/0 cgrp=default handle=-1345006464
at java.io.FileInputStream.read(FileInputStream.java: ~290)
at java.io.FileInputStream.read(FileInputStream.java: 245)
at com.zonasVuelo.Monchy.ZonasVueloActivity.leer(Zona sVueloActivity.java:126)
at com.zonasVuelo.Monchy.ZonasVueloActivity.leerPunto sPropios(ZonasVueloActivity.java:198)
at com.zonasVuelo.Monchy.ZonasVueloActivity.onCreate( ZonasVueloActivity.java:116)
at android.app.Instrumentation.callActivityOnCreate(I nstrumentation.java:1047)
at android.app.ActivityThread.performLaunchActivity(A ctivityThread.java:1622)
at android.app.ActivityThread.handleLaunchActivity(Ac tivityThread.java:1674)
at android.app.ActivityThread.access$1500(ActivityThr ead.java:117)
at android.app.ActivityThread$H.handleMessage(Activit yThread.java:942)
at android.os.Handler.dispatchMessage(Handler.java:99 )
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.jav a:3694)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCa ller.run(ZygoteInit.java:860)
at com.android.internal.os.ZygoteInit.main(ZygoteInit .java:618)
at dalvik.system.NativeStart.main(Native Method)


Doy por hecho que la maquina virtual de java tiene problemas a la hora de leer el txt pero no se porque, el archivo traces.txt si lo leéis me da error en una línea 126 en esa línea esta el siguiente código.


while(fileIN.read(reader)!= -1){ }


Este código esta en un método que también lo pongo


private String leer(){
String todo = null;
if(sitios.exists() && sitios.canRead()){
FileInputStream fileIN = null;
try{
fileIN = new FileInputStream(sitios);
byte [] reader = new byte[fileIN.available()];
while(fileIN.read(reader)!= -1){ }
todo = new String(reader);
}catch(Exception ex){
ex.printStackTrace();
}finally{
if(fileIN != null){
try{
fileIN.close();
}catch(IOException ioExcep){
ioExcep.printStackTrace();
}
}
}
}
return todo;
}


Muchas gracias, un saludo.

monchyrcg
28/06/12, 16:47:12
Veo que la gente lo lee, pero nadie dice nada.

mocelet
28/06/12, 17:18:30
Android se molesta un poco (mucho) si intentas leer streams desde el hilo de ejecución principal, y más si lo haces en el onCreate que tiene que ser un método muy ligero y salir cuanto antes.

Los ANR (Application Not Responding) suelen ser por eso, por tener el hilo principal (UI Thread) ocupado mucho tiempo.

kamarilla
29/06/12, 10:09:46
Buenas tardes, tengo una aplicación que cojo un txt de la sd y lo leo todo funcionaba bien pero ahora me da un error. En realidad no es un error la aplicación cuando arranca se queda con la pantalla en negro así todo el tiempo, en el logcat no me aparece error solo una linea que pone:


06-27 17:40:57.527: I/dalvikvm(3610): Wrote stack traces to '/data/anr/traces.txt'


En el traces.txt aparece esto:

DALVIK THREADS:
(mutexes: tll=0 tsl=0 tscl=0 ghl=0 hwl=0 hwll=0)
"main" prio=5 tid=1 SUSPENDED
| group="main" sCount=1 dsCount=0 obj=0x400245c8 self=0xcfb8
| sysTid=3610 nice=0 sched=0/0 cgrp=default handle=-1345006464
at java.io.FileInputStream.read(FileInputStream.java: ~290)
at java.io.FileInputStream.read(FileInputStream.java: 245)
at com.zonasVuelo.Monchy.ZonasVueloActivity.leer(Zona sVueloActivity.java:126)
at com.zonasVuelo.Monchy.ZonasVueloActivity.leerPunto sPropios(ZonasVueloActivity.java:198)
at com.zonasVuelo.Monchy.ZonasVueloActivity.onCreate( ZonasVueloActivity.java:116)
at android.app.Instrumentation.callActivityOnCreate(I nstrumentation.java:1047)
at android.app.ActivityThread.performLaunchActivity(A ctivityThread.java:1622)
at android.app.ActivityThread.handleLaunchActivity(Ac tivityThread.java:1674)
at android.app.ActivityThread.access$1500(ActivityThr ead.java:117)
at android.app.ActivityThread$H.handleMessage(Activit yThread.java:942)
at android.os.Handler.dispatchMessage(Handler.java:99 )
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.jav a:3694)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCa ller.run(ZygoteInit.java:860)
at com.android.internal.os.ZygoteInit.main(ZygoteInit .java:618)
at dalvik.system.NativeStart.main(Native Method)


Doy por hecho que la maquina virtual de java tiene problemas a la hora de leer el txt pero no se porque, el archivo traces.txt si lo leéis me da error en una línea 126 en esa línea esta el siguiente código.


while(fileIN.read(reader)!= -1){ }


Este código esta en un método que también lo pongo


private String leer(){
String todo = null;
if(sitios.exists() && sitios.canRead()){
FileInputStream fileIN = null;
try{
fileIN = new FileInputStream(sitios);
byte [] reader = new byte[fileIN.available()];
while(fileIN.read(reader)!= -1){ }
todo = new String(reader);
}catch(Exception ex){
ex.printStackTrace();
}finally{
if(fileIN != null){
try{
fileIN.close();
}catch(IOException ioExcep){
ioExcep.printStackTrace();
}
}
}
}
return todo;
}


Muchas gracias, un saludo.



Buenas:

Lo primero, comentarte que si explicarías lo que intentas hacer con el fichero, seria algo mas facial ayudarte, o si el código estaría comentado.
Aun asi, por lo que deduzco, tu intención es leer el fichero "traces.txt" y volcarlo en un String "todo" con el cual luego haras lo que sea.... ¿Me equivoco?

Por otro lado, no se si es la manera mas efectiva de leer de un fichero de texto de la SD, ya que coges un fichero de texto, que ya sabes que esta compuesto por strings, pero tu lo lees como byte y lo conviertes a string de nuevo. Con esto no te quiero decir que este mal, pero haces trabajar mas al proceso, sobretodo si el fichero es grande.

Mi consejo y la manera que uso yo en mis programas para leer los fichero que tengo en la SD... es la siguiente (No se si es la mejor, pero funciona perfectamente y rápido):

He modificado mi código para sea lo que intentas hacer mas o menos.



private String leer(){
String todo = "";
try{
\\ACCEDEMOS AL FICHERO QUE SE ENCUENTRA EN AL SD

File f = new File(Environment.getExternalStorageDirectory()+"/RUTA_DE_FICHERO/"+"/traces.txt");

FileInputStream fileIS = new FileInputStream(f);

BufferedReader buf = new BufferedReader(new InputStreamReader(fileIS));

String readString = new String();

//Leemos cada linea del fichero y la almacenamos en la variable todo

while((readString = buf.readLine())!= null){

todo=todo+(readString);


}

\\CERRAMOS EL ACCESO AL FICHERO

buf.close();
} catch (FileNotFoundException e) {

\\ CÓDIGO A REALIZAR SI EL FICHERO NO SE ENCUENTRA

e.printStackTrace();

} catch (IOException e){

\\ CÓDIGO A REALIZAR SI POR LO QUE SEA HAY UN FALLO DE LECTURA\ESCRITURA

e.printStackTrace();}
return todo;
}





Espero que te halla sido de ayuda, si tienes alguna duda mas y puedo ayudarte, no dudes en preguntar ;)

monchyrcg
29/06/12, 12:56:34
Gracias por el consejo de cambiar el modo de lectura, lo tendré en cuenta y lo cambiare.

No quiero leer el traces.txt quiero leer otro archivo de texto que esta en la SD. El fichero contiene por cada linea una latitud, longitud, nombre separados por comas, cojo esto y luego lo pinto en el mapa. Algo bastante fácil y sencillo y todo me iba hasta que de repente nada la aplicación en negro.

No me se ningún ANR se queda en negro y en el logCat pone lo que puse en el primer log, yo creo que se peta la maquina virtual de Android y me escribe el error en el fichero de texto traces.txt. Voy a probar ahora mismo en otro movil y con lo que tu me dices y os cuento.

kamarilla
29/06/12, 13:15:10
Gracias por el consejo de cambiar el modo de lectura, lo tendré en cuenta y lo cambiare.

No quiero leer el traces.txt quiero leer otro archivo de texto que esta en la SD. El fichero contiene por cada linea una latitud, longitud, nombre separados por comas, cojo esto y luego lo pinto en el mapa. Algo bastante fácil y sencillo y todo me iba hasta que de repente nada la aplicación en negro.

No me se ningún ANR se queda en negro y en el logCat pone lo que puse en el primer log, yo creo que se peta la maquina virtual de Android y me escribe el error en el fichero de texto traces.txt. Voy a probar ahora mismo en otro movil y con lo que tu me dices y os cuento.

Ok. Espero que te sirva.

Yo por norma general, desarrollo contra el simulador de android, aunque siempre me gusta hacer pruebas contra mi dispositivo, ya que no se compartan del todo igual.

Suerte, y ya nos contaras.

mocelet
29/06/12, 13:26:16
No me se ningún ANR se queda en negro y en el logCat pone lo que puse en el primer log

La pantalla se queda en negro porque bloqueas el hilo principal que es el que pinta, hasta que no salga del onCreate no tiene nada que pintar. Y concretamente, de la línea que pusiste no pasa porque se queda bloqueado ahí y Android suspende el hilo.

¿Esto de las coordenadas no lo habías hecho ya hace tiempo? ¡Ánimo!