![]() |
|
| Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android |
«
Tema Anterior
|
Siguiente tema
»
|
|
Herramientas |
|
#1
|
|
Error en la lectura de un txt
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:
Código:
06-27 17:40:57.527: I/dalvikvm(3610): Wrote stack traces to '/data/anr/traces.txt' Código:
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(ZonasVueloActivity.java:126) at com.zonasVuelo.Monchy.ZonasVueloActivity.leerPuntosPropios(ZonasVueloActivity.java:198) at com.zonasVuelo.Monchy.ZonasVueloActivity.onCreate(ZonasVueloActivity.java:116) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1622) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1674) at android.app.ActivityThread.access$1500(ActivityThread.java:117) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:942) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:130) at android.app.ActivityThread.main(ActivityThread.java:3694) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:507) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) at dalvik.system.NativeStart.main(Native Method) Código:
while(fileIN.read(reader)!= -1){ }
Código:
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;
}
|
|
|
|
#2
|
|
Veo que la gente lo lee, pero nadie dice nada.
|
|
#3
|
||||
|
||||
|
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. |
|
#4
|
||||
|
||||
|
Cita:
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. Código:
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 ;) Última edición por kamarilla Día 29/06/12 a las 10:12:30 |
|
#5
|
|
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. |
|
#6
|
||||
|
||||
|
Cita:
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. |
|
#7
|
||||
|
||||
|
Cita:
¿Esto de las coordenadas no lo habías hecho ya hace tiempo? ¡Ánimo! |
| Respuesta |
Estás aquí
|
||||||
|
||||||
«
Tema Anterior
|
Siguiente tema
»
| Herramientas | |
|
|
Hora actual: 13:46:44 (GMT +1)
HTCMania: líderes desde el 2007






