如果我们需要在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;
}
};
}