我使用此代码从资源中读取文字:
private void Read(String file){
try{
String Name = file;
Name = Name.replaceAll("'", "");
file = getAssets().open(Name + ".txt");
reader = new BufferedReader(new InputStreamReader(file));
line = reader.readLine();
Text ="";
while(line != null){
line = reader.readLine();
if (line !=null){
Text += line+"\n";
LineNumber++;
if(LineNumber==50){btnv.setVisibility(View.VISIBLE);break; }
}
}
if (LineNumber<50){btnv.setVisibility(View.GONE);}
txtv.setText(Text);
}
catch(IOException ioe){
ioe.printStackTrace();
}
}
所以我必须阅读前50行文本,因为文本超过300行,而我所知道的是逐行读取文件,所以如果我逐行读取300行应用程序会冻结很长时间,所以我读了50行第一行然后50行等等...... 因此,在我用该代码读取前50行之后,我将其他代码称为下一个代码:
private void ContinueReading(){
if (LineNumber >= 50){
try{
while(line != null){
line = reader.readLine();
if (line !=null){
Text += line+"\n";
LineNumber++;
if (LineNumber==100){break;}
if (LineNumber==150){break;}
if (LineNumber==200){break;}
if (LineNumber==250){break;}
if (LineNumber==300){break;}
if (LineNumber==350){break;}
if (LineNumber==400){break;}
if (LineNumber==450){break;}
}
else{
btnv.setVisibility(View.GONE);
}
}
txtv.setText(Text);
}
catch(IOException ioe){ioe.printStackTrace();}
}
}
但是当你看到我离开时:
file = getAssets().open(emri + ".txt");
reader = new BufferedReader(new InputStreamReader(file));
这是不好的,无论如何要关闭它们并再次打开它们并开始从最后一行开始阅读,或者任何想法如何开始从前阅读。第50行,然后从第100行等。?
答案 0 :(得分:2)
这似乎是AsyncTask
的好地方。您甚至可以使用文本更新TextView
,因为它正在从文件中读取。
txtv.setText("");
new MyFileReader().execute(filename);
.
.
.
// inner class
public class MyFileReader extends AsyncTask<String, String, Void> {
@Override
protected Void doInBackground(String... params) {
try{
InputStream file = getAssets().open(params[0].replaceAll("'", "") + ".txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(file));
String line;
while ((line = reader.readLine()) != null) {
publishProgress(line + "\n");
}
reader.close();
} catch(IOException ioe){
Log.e(TAG, ioe);
}
return null;
}
@Override
protected void onProgressUpdate(String... values) {
txtv.append(values[0]);
}
}
答案 1 :(得分:1)
您应该使用另一个线程一次读取整个文件,
但要小心,你不能在不同的线程而不是主线程上执行任何与UI相关的操作(比如改变TextView的文本)....为此,请关注以下链接,
Android “Only the original thread that created a view hierarchy can touch its views.”