2011-12-20 24 views
6

Quiero leer archivos de gran tamaño desde sdcard en la vista de texto. Tengo una idea, pero no sé cómo postularme.Lea un archivo de texto grande en Textview

creo que estas cosas tienen que usar: Handler y Tema

pero no sé cómo aplicar. Alguien da algún ejemplo o Tutorial.

Actualizado:

Thread test=new Thread() 
    { 
     public void run() 
     { 
    File sfile=new File(extras.getString("sfile")); 
    try { 
     StringBuilder text = new StringBuilder(); 
     BufferedReader br = new BufferedReader(new FileReader(sfile)); 
     String line1; 
     while(null!=(line1=br.readLine())) 
     { 
      text.append(line1); 
      text.append("\n"); 
     } 
     subtitletv.setText(text.toString()); 

    } catch (FileNotFoundException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
     } 
    }; 
    test.start(); 

Ésta es mi code.But es mejor que el código anterior, pero no es capaz de leer el archivo de 2 MB. ¿Cómo hacer esto? Y cómo establecer el progreso?

+0

Definir * * no es capaz. ¿Le da un error? ¿Entonces qué? – MrZander

+0

Sí Error Force Close error. –

+0

Coloque el logcat – MrZander

Respuesta

9

Aquí hay un ejemplo de cómo hacerlo. Si el archivo es tan grande que le tomará más de 5 segundos leerlo, entonces probablemente solo sea AsyncTask.

// first open the file and read it into a StringBuilder 
String cardPath = Environment.getExternalStorageDirectory(); 
BufferedReader r = new BufferedReader(new FileReader(cardPath + "/filename.txt")); 
StringBuilder total = new StringBuilder(); 
String line; 
while((line = r.readLine()) != null) { 
    total.append(line); 
} 
r.close(); 

// then get the TextView and set its text 
TextView txtView = (TextView)findViewById(R.id.txt_view_id); 
txtView.setText(total.toString()); 

EDITAR

Sólo puede cambiar elementos de la IU en el hilo de interfaz de usuario. El documentation on threads tiene más detalles. Cuando intenta hacerlo desde otro hilo, se obtiene este (de su Pastebin):

E/AndroidRuntime(8517): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 

Creo que la solución más fácil es usar AsyncTask, como lo recomienda antes. Simplemente coloque su código de trabajo en una función (doInBackground()) y su código de UI en otro (onPostExecute()) y AsyncTask se asegura de que se les llame por los hilos correctos y en orden. La documentación a la que he vinculado tiene ejemplos con la carga de mapas de bits, que es casi lo mismo que cargar texto.

+0

He actualizado mi pregunta. Gracias pero nuevo problema. No se puede leer un archivo más grande que 2MB –

+0

@Cyboysa El error que está recibiendo no es para el tamaño del archivo, es para los problemas de seguridad del hilo. Cuando use 'Thread', debe administrar la seguridad de hilos manualmente. Pruebe 'AsyncTask' y vea si eso funciona. –

+0

Guau, eso es rápido oO Nunca pensé que StringBuilder en combinación con BufferedReader tendrá ese impacto en el rendimiento. Gracias por compartir esto. –

0

Cree un nuevo subproceso y luego usando openFileforInput lea todos los datos del archivo en StringBuffer.

Utilice el método TextView.setText() para establecer los datos.

1

Su problema es que se está accediendo a una vista de propiedad de la rosca GUI desde el hilo que está leyendo su archivo:

subtitletv.setText(text.toString()); 

Es necesario leer el archivo, a continuación, pasar a su contenido al hilo principal de se mostrará.

//Create a handler on the UI Thread: 
private Handler mHandler = new Handler(); 

//Executed in a non-GUI thread: 
public void updateView(){ 
    final String str = TheDataFromTheFile; 
    mHandler.post(new Runnable(){ 
     @Override 
     public void run() { 
      subtitletv.setText(str); 
     } 
    } 
} 
0

interfaz de usuario se puede actualizar mediante el uso de esto también:

runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 

     } 
}); 
Cuestiones relacionadas