我想从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文件。 如何解决这个问题? 以及如何设定进度?
答案 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() {
}
});