如果我们需要在Android中界面中加载文本,如果文本稍大,这个过程就会很耗时,一旦超过一个系统规定的时间,就会提示无响应,所以我们采用子线程来实现加载文本,然后送到主线程中。
首先我们定义这样一个类,来进行文件的读:
public
class ReadFileThread implements Runnable {
public boolean readfinish = false;
public List list = null;
public void run() {
list = new ArrayList(); //
初始化list集合
list.clear(); //
清空list中的内容
readfinish = false;
try {
File file =
new File("/sdcard/sanguo.txt");
RandomAccessFile
randomAccessFile = new RandomAccessFile(file, "r");
while
(randomAccessFile.getFilePointer() < randomAccessFile
.length())
{
//
将读取到的字符串使用iso8859-1编码格式转化为字节,在使用utf-8编码格式转化成字符串
String
s = new String(randomAccessFile.readLine().getBytes(
"iso8859-1"),
"utf-8");
//
将字符串添加到list中
list.add(s);
}
} catch (FileNotFoundException
e) {
// TODO
Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO
Auto-generated catch block
e.printStackTrace();
}
readfinish = true;
}
}
在MainActivity中,我们定义一个内部类:
class ReadListener extends Thread {
@Override
public void run() {
super.run();
int i = 0,
newi = 0;
while
(!readFileThread.readfinish) {
newi
= readFileThread.list.size();//list的长度
//当读取的文件超过十行时,通知ui更新
if
(newi - i > 10) {
temp
= readFileThread.list
.toArray(new
String[readFileThread.list.size()]);
handler.post(runnable);
}
}
//当数据读取完毕后,发送更新请求
temp =
readFileThread.list.toArray(new String[readFileThread.list
.size()]);
handler.post(runnable);
}
}
在onStart方法中,实现:
protected void onStart() {
super.onStart();
//启动读线程
Thread thread=new
Thread(readFileThread);
thread.start();
ReadListener listener=new
ReadListener();
listener.start();
//更新ui线程
runnable = new Runnable()
{
@Override
public void
run() {
int
i = 0;
//得到的字符串组合并成字符串
for
(i = curi; i < temp.length; i++) {
s
+= temp[i] + "\n";
}
tv.setText(s);
curi
= i;
}
};
}