第一种,使用线程
实用场景一:比如需要联网的操作,我们知道互联网的效率相对来说是不恒定的,有时候快,有时候慢,如果遇上网络不好的时候,程序一直处于联网等待状态,一方面给用户不好的体验,另一方面很容易出现经典的ANR异常。
实用场景二:比如带图片的listview的显示,我们知道通常的图片比文字信息大很多,如果listview带图片,我们同步的获取文字和图片,这样的加载效率会比较慢,通常的做法是会在主线程里去拉取文字信息,然后另外一个线程异步的加载图片。
异步加载信息时需要注意的一个问题,那就是在手动开启的线程中不允许直接操主线程(也即是activity)里面的UI,不过Android提供了一套比较完善的方案。
第一步:使用ProgressDialog对话框,它是一个带进度条的信息提示框,比如经典的提示语“正在。。。。请稍后。。。”,该对话框一旦被show,直到被dismiss都将一直显示。
使用示例:
ProgressDialog progressDialog = ProgressDialog.show(Context,"提示框的标题", "提示框的主体内容...", true, false);
第二步:使用线程执行比较耗时的操作
new Thread() {
@Override
public void run() {
try {
//此处处理耗时的操作
} catch (Exception e) {
handler.sendEmptyMessage(1);
} finally{
//向handler发消息
handler.sendEmptyMessage(0);
}
}
}.start();
第三步:使用Handler更新UI。
前边说了,手动开启的线程里面是不能直接操作主进程里面的UI,所以android提供了一个Handler类来接收线程的消息,然后更新UI。
/**
* 用Handler来更新UI
*/
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if(Constant.DEBUG) Log.i(tag, "msg.what="+msg.what);
switch (msg.what) {
case 0:
//线程执行成功后在此更新UI
//撤销对话框
progressDialog.dismiss();
break;
case 1:
Toast.makeText(Context, "异常", Toast.LENGTH_LONG).show();
break;
}
}
};