1、需要先建立一个进度条对话框,并显示。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
detailText = (TextView) findViewById(R.id.detail_text);
final ProgressDialog dialog = new ProgressDialog(this);
dialog.setTitle("提示");
dialog.setMessage("正在读取数据,请稍候....");
dialog.show();
// 建立新的线程
Thread t = new Thread() {
@Override
public void run() {
// 取得数据
String path = getIntent().getStringExtra("fullPath");
// 建立文件
File file = new File(path);
// 读取
try {
// 需要使用InputStreamReader对读入的文件内容进行转码,前提文本是GBK编码就必须转码.
BufferedReader reader = new BufferedReader(
new InputStreamReader(new FileInputStream(file),
"GBK"));
String line = null;
// 保存所有文本的StringBuilder
StringBuilder builder = new StringBuilder();
while ((line = reader.readLine()) != null) {
builder.append(line + "\r\n");
}
reader.close();
// 将数据设置到TextView里
detailText.setText(builder.toString());
// 隐藏进度条
dialog.dismiss();
} catch (Exception e) {
e.printStackTrace();
}
}
};
t.start();
测试时会提示错误,只有 主线程 可以对界面进行修改,其他子线程无法修改界面。
但这里在子线程中必须要修改界面,为了解决这种问题,Android提供了一个消息通道,让子线程通知主线程进行界面更新。
需要自己建立一个Handler类,来在主线程中修改界面。
handler = new Handler(){
@Override
public void handleMessage(Message msg) {
// 当接收到子线程发送的消息时,自动调用这个方法.
// 从子线程传递的消息中取得内容,并设置
detailText.setText(msg.obj.toString());
}
};
在线程中完成这个操作。
// 将数据设置到TextView里
Message msg = new Message();
msg.obj = builder.toString();
handler.sendMessage(msg);
进度条可以调整为横向显示的功能。
final ProgressDialog dialog = new ProgressDialog(this);
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.setTitle("提示");
dialog.setMessage("正在读取数据,请稍候....");
// 提供最大值, 这里设置为要读取文件的大小
dialog.setMax((int) (new File(getIntent().getStringExtra("fullPath"))
.length()));
dialog.show();
while ((line = reader.readLine()) != null) {
builder.append(line + "\r\n");
size += line.getBytes().length;
if (size >= 10240) {
// 增长进度条
dialog.incrementProgressBy(size);
size = 0;
// 睡眠一小段时间
Thread.sleep(10);
}
}
reader.close();