将大文本文件读入Textview

时间:2011-12-20 17:42:12

标签: android

我想从SD卡中读取大文件到文本视图中。 我有想法,但我不知道如何申请。

我觉得这个东西需要用: 处理程序和 螺纹

但我不知道如何申请。 任何人都举一些例子或教程。

更新

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

这是我的代码。但它比以前的代码更好, 但它无法读取2MB文件。 如何解决这个问题? 以及如何设定进度?

4 个答案:

答案 0 :(得分:9)

以下是如何操作的示例。如果文件太大而读取时间超过5秒钟,那么它应该只是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());

修改

您只能更改UI线程中的UI元素。 documentation on threads有更多详细信息。当您尝试从另一个线程执行此操作时,您(从您的pastebin)获取此信息:

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

我认为最简单的解决方案是使用AsyncTask,正如我之前推荐的那样。您只需将工作代码放在一个函数(doInBackground())中,将您的UI代码放在另一个函数(onPostExecute())中,AsyncTask确保它们在正确的线程上按顺序调用。我链接的文档包含加载位图的示例,这与加载文本几乎相同。

答案 1 :(得分:1)

您的问题是您正在从正在读取文件的线程中访问GUI线程所拥有的View:

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

答案 2 :(得分:0)

创建一个新线程,然后使用openFileforInput将所有文件数据读入StringBuffer。

使用TextView.setText()方法设置数据。

答案 3 :(得分:0)

UI也可以使用它来更新:

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

       }
});