2011-12-20 12 views
6

Voglio leggere il file di grandi dimensioni dalla sdcard in visualizzazione testo. Ho idea ma non so come applicare.Leggere un grande file di testo in Textview

Credo che questo cose devono utilizzare: Handler E Discussione

ma non so come applicare. Chiunque fornisce qualche esempio o tutorial.

Aggiornato:

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(); 

Questo è il mio code.But è meglio che il codice precedente, ma non è in grado di leggere file di 2 MB. Come far sloggiare questo? E come impostare lo stato di avanzamento?

+0

Definire * non è in grado *. Hai un errore? E allora? – MrZander

+0

Sì Errore Errore chiusura forzata. –

+0

Pubblica il logcat – MrZander

risposta

9

Ecco un esempio di come farlo. Se il file è così grande da richiedere più di 5 secondi per leggere, probabilmente dovrebbe essere solo un 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()); 

EDIT

È possibile modificare solo elementi dell'interfaccia utente nel thread UI. Il documentation on threads ha più dettagli. Quando si tenta di farlo da un altro thread, si ottiene questo (dal pastebin):

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

Penso che la soluzione più semplice sta usando AsyncTask, come ho raccomandato prima. Hai appena inserito il tuo codice di lavoro in una funzione (doInBackground()) e il tuo codice UI in un altro (onPostExecute()), e AsyncTask si assicura che vengano richiamati sui thread giusti e in ordine. La documentazione che ho collegato ha esempi con il caricamento di bitmap, che è quasi la stessa cosa del caricamento del testo.

+0

Aggiornato la mia domanda.Grazie però nuovo problema.Non riesci a leggere File più grande di 2MB –

+0

@Cyboysa L'errore che stai ricevendo non è per le dimensioni del file - è per problemi di sicurezza dei thread. Quando usi 'Thread', devi gestire la sicurezza del thread manualmente. Prova 'AsyncTask' e vedi se funziona. –

+0

Wow, è veloce oO Non ho mai pensato che StringBuilder in combinazione con BufferedReader avrebbe avuto un impatto sulle prestazioni. Grazie per aver condiviso questo. –

0

Creare una nuova discussione utilizzando quindi openFileforInput per leggere tutti i dati dei file in StringBuffer.

Utilizzare il metodo TextView.setText() per impostare i dati.

1

Il tuo problema è che si sta accedendo a View di proprietà del filo GUI dal thread che sta leggendo il file:

subtitletv.setText(text.toString()); 

Hai bisogno di leggere il file, quindi passare il suo contenuto al thread principale essere visualizzato.

//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

interfaccia utente può essere aggiornato utilizzando questo anche:

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

     } 
}); 
Problemi correlati