我们都知道,Android所采用的是UI单线程模式,UI操作只能在主线程中进行;而为了提高用户体验Google规定耗时的操作不允许在主线程中进行,因此在程序中更新数据等耗时操作必须在子线程中进行,这样就要求两个线程之间进行数据通信。
程序中的耗时操作是在网上下载一个图片并显示在ImageView中,我将采用三种不同的方法实现UI的刷新,如有错误还请大神们指正。
首先上Github网址 https://github.com/MikoGodZd/HttpTest.git
- Handler + Thread
- AsynacTask异步操作
- runOnUIThread
一、Handler+Thread
这是最经典的线程间通讯的方法,不熟悉Handler消息机制的朋友可以参考一下这篇文档:
Android知识梳理:消息机制之Handler:http://gqdy365.iteye.com/blog/2148925
Android知识梳理:消息机制之Looper :http://gqdy365.iteye.com/blog/2137494
- 优点:功能定义明确,多个异步操作时简单。
- 缺点:单个异步操作时臃肿
首先我们在主线程中new一个Handler
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
然后我们实现一个Runnable接口
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
最后在onCreate中开辟新的线程并运行
- 1
- 2
- 3
- 4
- 5
- 6
二、AsynacTask异步操作
AsyncTask,是android提供的轻量级的异步类,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程.
新手朋友请参考http://www.cnblogs.com/devinzhang/archive/2012/02/13/2350070.html
- 优点:简单快捷,过程可控
-
缺点:多个异步操作时,易发生不可控错误
在AsynacTask中我们至少重写两个方法
-
doInBackground(Params…) 后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress…)来更新任务的进度。
- onPostExecute(Result) 相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI。 此方法在主线程执行,任务执行的结果作为此方法的参数返回
ok我们创建一个新的class类
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
然后在onCreate中执行
- 1
- 2
- 3
- 4
- 5
- 6
- 7
三、runOnUiThread
名字很直白的一个方法=_=+/// 这个方法开启一个新的线程
与第一种方法类似,先实现Runnable接口
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
同样最后在onCreate中开启线程