`
changkunyang
  • 浏览: 30318 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

说说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;
				
			}
		}
	};


 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics