说说android异步加载的三种方式之线程的使用

 

第一种,使用线程

实用场景一:比如需要联网的操作,我们知道互联网的效率相对来说是不恒定的,有时候快,有时候慢,如果遇上网络不好的时候,程序一直处于联网等待状态,一方面给用户不好的体验,另一方面很容易出现经典的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;
				
			}
		}
	};


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值