2011-12-20 20 views
6

我想将大文件从sdcard读入文本视图。 我有想法,但我不知道如何申请。将大文本文件读入文本视图

我觉得这个事情需要使用: 处理器和 主题

但我不知道如何申请。 有人给了一些例子或教程。

更新时间:

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它比以前的代码更好, 但它无法读取2MB的文件。 如何解决这个问题? 如何设置进度?

+0

定义*不能*。你有错误吗?如果是这样,什么? – MrZander 2011-12-20 20:06:20

+0

是错误强制关闭错误。 – 2011-12-20 20:17:05

+0

发布logcat – MrZander 2011-12-20 20:22:26

回答

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有更多的细节。当您尝试从另一个线程做到这一点,你得到这个(从引擎收录):

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中,以确保它们在正确的线程上按顺序调用。我链接到的文档有加载位图的例子,这与加载文本几乎是一回事。

+0

更新我的问题。谢谢,但新的问题。无法读取大于2MB的文件 – 2011-12-20 19:49:56

+0

@Cyboysa你得到的错误不是文件大小 - 这是线程安全问题。当你使用'Thread'时,你必须手动管理线程安全。试试'AsyncTask'并看看是否有效。 – 2011-12-20 20:56:16

+0

哇,这是快速oO从来没有想过与BufferedReader结合使用StringBuilder会对性能产生影响。感谢分享这个。 – 2016-01-17 21:02:02

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

     } 
});