2011-12-20 10 views
6

大きなファイルをsdcardからテキストビューに読み込みたい。 私は考えがありますが、私はどのように適用するのか分かりません。大きなテキストファイルをTextviewに読み込む

私はこの事が使用する必要があると思う: ハンドラと スレッド

しかし、私はどのように適用するかを知りません。 誰かがいくつかの例やチュートリアルを提供します。更新

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

これは私のcode.Butそれは、 前のコードよりも優れているが、2メガバイトのファイルを読み取ることができません。 これをスローするには? 進捗状況を設定するには?

+0

は* *ことができません定義します。間違いはありますか?もしそうなら、何? – MrZander

+0

はいエラー強制終了エラー。 –

+0

投稿するlogcat – MrZander

答えて

9

これを行う方法の例を示します。ファイルが大きすぎて読み上げに約5秒以上かかる場合は、おそらくちょうどAsyncTaskであるはずです。あなたが唯一のUIスレッドでUI要素を変更することができ

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

documentation on threadsに詳細があります。あなたが別のスレッドからそれを実行しようとすると、(自分のペーストビンから)これを取得:

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

私は私が前に推奨されているように、最も簡単な解決策は、AsyncTaskを使用していると思います。作業コードを1つの関数(doInBackground())に、UIコードを別のもの(onPostExecute())に入れて、AsyncTaskが正しいスレッドで順番に呼び出されるようにします。リンク先のドキュメントにはビットマップを読み込む例がありますが、これはテキストの読み込みとほぼ同じです。

+0

私の質問が更新されました。新しい問題です.2MBより大きいファイルを読み取ることはできません。 –

+0

@Cyboysaエラーはファイルサイズではなく、スレッドの安全性の問題です。 'Thread'を使うときは、スレッドの安全性を手動で管理する必要があります。 'AsyncTask'を試してみましょう。 –

+0

うわー、それは速いですね.O BufferedReaderと組み合わせてStringBuilderがパフォーマンスに与える影響は決して考えられませんでした。これを共有してくれてありがとう。 –

0

openFileforInputを使用して新しいスレッドを作成し、すべてのファイルデータをStringBufferに読み込みます。

TextView.setText()を使用してデータを設定します。

1

あなたの問題は、あなたがあなたのファイルを読んでいるスレッドからGUIスレッドが所有するビューにアクセスしているということです。

あなたは、その後に、メインスレッドにその内容を渡し、ファイルを読む必要が
subtitletv.setText(text.toString()); 

表示されます。

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

UIも、これを使用して更新することができます。

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

     } 
}); 
関連する問題