Android学习笔记线程Message和Runnable

上传人:z**** 文档编号:50374055 上传时间:2022-01-20 格式:DOC 页数:6 大小:51KB
收藏 版权申诉 举报 下载
Android学习笔记线程Message和Runnable_第1页
第1页 / 共6页
Android学习笔记线程Message和Runnable_第2页
第2页 / 共6页
Android学习笔记线程Message和Runnable_第3页
第3页 / 共6页
资源描述:

《Android学习笔记线程Message和Runnable》由会员分享,可在线阅读,更多相关《Android学习笔记线程Message和Runnable(6页珍藏版)》请在装配图网上搜索。

1、An droid 学习笔记:线程:Message和 Ru nn able程序需要相应用户的操作,最要能在200ms (0.2s )之内,如果超过5秒没有反应,ActivityManager会没有提示就kill 了 activity 。然而,activity可能真的需要时间来进行处理,这往往会用到后台线程-background thread 。后台线程可以 安全地 和UI线程进行交互, 其中后台线程是不能修改UI的。我不太确切知晓“不能修改UI”到何种程度,例如在下面的 例子进度条状态的修改是允许的,在复杂的例子中可能会出现问题,例如两个后台线程都要处理同一个widget,可能会有不可预知的情况

2、出现,然而就编程而言,确实不应当如此处理,后 台进程应避免涉 及UI的处理,UI的归UI,处理的规处理。这样才是良好的编程风格或者是一 种编程原则。通过创建一个Handler子类的对象,每个acvivity 只需一个Handler对象。后台进程可通过两 种方式Handler进行通 信:message和Runnable对象,其结果实质都是将在 Handler的队列 中放入内容,message是放置信息,可以传递一些参 数,Handler获取这些信息并将判度如何 处理,而Runnable则是直接给出处理的方法。队列就是依次执行,Handler会处理完一个消息或者执 行完某个处理在进行下一步,这样不

3、会出现多个线程同时要求进行UI处理而引发的混乱现象。这些队列中的内容(无论 Message还是Runnable)可以要求马上执行,延迟一定时间执行或者 指定某个时刻执行,如果将他们放置在队列头,则表示具有最高有限级别,立即执行。这些函数包括有:sendMessage(), sendMessageAtFrontOfQueue(), sendMessageAtTime(), sendMessageDelayed()以及用于在队列中加入 Runnable 的 post(), postAtFrontOfQueue(), postAtTime(),postDelay() 。一般而言,推荐是Messge方

4、式,这样程序设计得可以更为灵活,而 Runnable在某些简单明确 的方式中使用。我们将通过三种方法编写一个小例子来学习。这个例子是一个进度条,每隔1秒,进度条步进5,如果acvity停止时,进度条归零。An droid XML :vProgressBar android:id=+id/c15_progressstyle=?android:attr/progressBarStyleHorizontal android:layout_width=fill_parent android:layout_height=wrap_content/例子一:线程开启,采用Message传递后台线程和UI主线

5、程之间的信息public class Chapter15Test1 extends Activityprivate ProgressBar bar = null;private boolean isRunning = false;/*我们为这个Acivity创建一个用于和后台程序通信的handler,简单地,只要一收到 message,就将progressbar 进度增加 5。*/* 步骤1 :创建Handler,并通过handleMessage()给出当收到消息是 UI需要进行如何处理,例子简单 不对msg的内容进行分析*/Handler handler= new Handler()publ

6、ic voidhandleMessage (Message msg) bar.incrementProgressBy(5);protected void onCreate(Bundle savedlnstanceState) super.onCreate(savedlnstanceState);/*on Start 是UI初始化并显示时调用*/protected void onStart() super.onStart(); bar.setProgress(O);/*步骤2:建立后台线程处理,采用Thread,其中run()的内容,就是线程并行处理的内容,Thread是 Runnable 的

7、implements*/Thread background = new Thread(new Runnable()public voidrun () tryfor(int i = 0; i 20 & isRunning; i +)Thread.sleep(1000);/*步骤2.1 :发送 Message到队列中,参数中的 obtainMessage()是用于给出一 个新Message,本例无参数,对应的在 handler在队列中收到这条消息时,则通过 handleMessage()进行处理 */handler.sendMessage(handler. obtainMessage ();cat

8、ch(Throwable t)/jest end the thread);isRunning = true;/*步骤3 :启动线程*/background.start();/*onStop是UI停止显示时调用,例如我们按了返回键*/protected void onStop() super.onStop();isRunning = false;例子2:采用Runnable我们在上面的例子的基础上进行修改,如下/*步骤1 :由于不需要处理 Message,也即不需要处理handleMessage()*/Handler handler= new Handler。;/*步骤1.1 :定义处理动作,采

9、用Runnable的实例,通过implements run ()来定制处理,这里是简单将进度条步进5。由于我们将在 Thread中使用这个实例,所以考虑采用 final的方式*/final Runnable r =new Runnable() public void run()bar.incrementProgressBy(5);/* 在onStart()中的步骤2 :线程的处理,和提供 message不同,对于runnable方式,采用post*/Thread background = new Thread(new Runnable()public void run() tryfor(int

10、 i = 0; i 20 & isRunning; i +)Thread.sleep(1000);handler.post(r);catch(Throwable t)/jest end the thread);background.start();例子3:可以用延迟处理实现定时触发,让程序更为简单在这里例子,事实我们是进行定时的处理,利用Handler队列可以设置延期处理的方式,我们并不需要创建一个后台运行的线程,也可以实现Handler handler= new Handler。; 在 onStart()/ 利用handler.postDelayed(r,1000),在队列中要求延迟 1秒后

11、进行r的处理,而在r的处理中,最后在handler的队列中加 入一个要求延迟1秒的处理,如是,就可以实现每隔1秒的定期处理。handler.postDelayed(new Runnable() public void run() if(isRunning & Chapter15Test2.step 20)step +;bar.incrementProgressBy(5);handler.postDelayed(this, 1000);, 1000);在这个例子中,我们基础某种判度,自动停止向队列加入处理。如果有某种情况, 我们需要清除队列中的消息或者理,可以使用 removMessages()

12、或者 removeCallbacks()的处理,这种对于延迟处理方式是非常有用的,可以中断定期 的处理。当然,一般来讲我们希望能够得到某种判度,以使得定期处理能够优雅地结束,而不是简单地从队列中将消息或者处理删除。例子4:不知道在UI主线程还是在后台线程有时候,我们并不清楚代码将在UI线程还是后台线程运行,例如这些代码封装为一个JAR提供给其他人调用,我们并不清楚其他人如何使用这些代码。为了解决这个问题An droid在activity中提供了 runOnUiThread(),如果在UI线程,贝U马上执行,如果在后台线程,则将Runnable的执行内容加入到后台线程的队列中,这样无论代码在UI

13、线程还是后台线程都能安全地执行。我们在例子1的基础上进行试验:1、建立一个Runnable,以便我们将在UI和后台Thread中进行试验Runnable runAction = new Runnable()public void run()/注意,我们不能使用 Toast.makeText(this,.),因为我们无法确定 Runnable具体运行的contextToast.makeText(getApplicationContext (),Hello!,Toast.LENGTH_SHORT).show();Log.d(WEI,runAction . is called);由于Toast的显示

14、和隐藏需要一定的时间,而间隔 1秒显然不够,我们将例子1的间隔时间1000ms改为5000ms这样会比较清晰,当然可以采用 Log.d的方式来 替代。2、在UI线程中执行该操作,在后台线程中增加该操作,这个操作无论是在UI还是在后台线程都是可以正确执行的protected void onStart() Thread background = new Thread(new Runnable()public void run() tryfor(int i = 0; i 20 & isRunning; i +)Thread.sleep(5000);handler.sendMessage(handle

15、r.obtainMessage();runOnUiThread (runAction);catch(Throwable t)/jest end the thread);isRunning = true;background.start();runOnUiThread (runAction);例子 5: HandlerThread在上面的例子中,无论是否使用了后台线程(例子 1-2),Handler的处理实际就是UI主线程 的处理,一般的使用方式为我们通过后台线程执行某些操作,如果需要进行 UI的互动,将消息或者处理方式到Handler的的队列中,然手在UI主线程中进行处理。这是我们通用的情况。

16、之前我们讨论过为何UI的归UI,处理的处理,然而,可能有这样的需求,举个例子,在某些 情况下,Handler收到消息触发的处理中可能会有Sleep(),这会导致main线程进入sleep状态,不是我们期待的。因此我们希望通过一个线程专门处理Hanlder的消息,这个线程也是依次从Handler的队列中获取信息,逐个进行处理,保证安全,不会出现混乱引发的异常。针对此An droid提供的Han dlerThread。方式使用方法如下:/步骤1 :创新HandlerThread 的一个对象,并开启这个线程,HandlerThread 将通过Looper来处理 Handler对来中的消息,也就是如果

17、发现Handler中有消息,将在 HandlerThread这个线程中进行处理。HandlerThread ht = new HandlerThread(hander_thread);/步骤2 :启动handerhandler 这个线程;ht.start();/步骤3 :创建handler中,带上 Looper的参数,即 handlerThread.getLooper()。注意,此处理必须在HandlerThread启动后才能调用,否则会报错,getLooper()会返回null ,则程序异常出错Handler handler = new Handler(ht.getLooper() public void handleMessage(Message msg)/*这里的处理,将不在主线程中执行,而在 HandlerThread线程中执行,可以通过Thread.currentThread().getld() 或者 Thread.currentThread().getName() 来确定 */;

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!