预览加载中,请您耐心等待几秒...
1/5
2/5
3/5
4/5
5/5

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

Android环境下主UI线程与子线程通信机制研究论文1问题的引出如果需要用手机从网络上下载一个图片到自己的手机上,在onCreate方法中可以如下图1所示的代码。通过代码会获取并显示所需要的位图。但其中隐藏着一个非常危险的问题——代码本身就是运行在主线程上。Android系统只能运行一个主线程,而且只有主线程能够与屏幕之间进行任意权限级别的交互。这意味着,当代码等待网络回传图片数据的时候,任何内容都无法显示到屏幕上。这段获取图片的代码会限制在手机上任意地方执行任意操作。所以如果主线程被绑架,那么它在被释放之前,系统就不会响应按单击事件,不能接电话,屏幕上不能显示任何内容。这对于手机用户来说是灾难性的。2什么是子线程为了有效解决手机被绑架的问题,提高用户体验,提出了子线程。在Android的布局界面中,可以实现按钮的单击、TextView内容的修改,所有这些与界面控件相关的操作,实际上都是由主UI线程在负责运行。但有时候,程序会执行一些耗时的操作,比如复杂的计算、访问网络,下载数据,查询数据库、甚至包括让线程休眠等,这些操作如果放到主UI线程中执行,会造成主UI线程无法及时响应用户在界面上的操作,造成界面假死的状态。一般的解决方案是将耗时的操作交给另外一个子线程来执行,从而保证主UI线程的畅通。有时候子线程在完成了一部分的耗时操作以后,希望能够在主界面上有所体现,此时子线程是不能够直接操作界面控件的,它必须通过消息的方式告知主UI线程进行控件更新。3子线程与主UI线程的通信原理Android应用程序运行时,一个主线程被创建(也称作UI线程),此线程主要负责处理UI相关的事件,由于Android采用UI单线程模型,所以只能在主线程中对UI元素进行操作,如果在非UI线程直接对UI进行了操作,则会报错,另外,对于运算量较大的操作和IO操作,我们需要新开线程来处理这些工作,以免阻塞UI线程,子线程与主线程之间通信原理如下图2所示。从上图2可以看出,要完成子线程与主UI线程之间的通信,需要配合多个类来完成。其中Thread类负责线程工作,要创建该类需要实现Runnable接口的run()方法,run()方法中一般是耗时操作的`代码。第二个类是Message类,用来描述消息,在Message对象中可以存储一些信息。第三个类是Handler类,用来发送和接受消息,要创建该类需要实现handleMessage(Messagemsg)方法,该方法会在Handler对象接收到消息时被调用。那么这三个类之间协同合作,才能有序地完成子线程与主UI线程之间的通信。3.1Thread类要创建子线程对象,就需要使用Thread类。要创建该类需要实现Runnable接口的抽象方法run(),在run()方法中需要添加子线程所要运行任务的代码。其次,Sleep(longtime)方法是让线程休眠,其中time为休眠的时间,单位时毫秒。最后一定要用start()方法运行线程。之后该子线程就可以开始工作了。子线程在特定情况下需要通过Handler发送Message给主UI线程,委托主UI线程进行一些与界面相关的处理,所以,发送消息的Handler类也是其中的一个很重要的类。3.2Message类Message类型的消息中包含了一个int类型的成员对象what,利用what可以区分不同的消息类型。返回值有两种情况,如果消息成功放置到消息队列则返回true,否则返回false。3.3Handler类发送消息:所使用的类为Handler类,方法为publicbooleansendMessage(Messagemsg),其中,msg是消息对象。Message类型的消息中包含了一个int类型的成员对象what,利用what可以区分不同的消息类型。子线程将消息发送给主线程,主线程收到消息之后,会根据传过来的消息信号的不同做不同的动作。如果消息号为STOP,则子线程结束消息的传送,如果消息号为CONTINUE,则继续传送消息。当子线程的状态发生变化,则在子线程中发出Message,通知更新UI。接收处理消息:使用的是Handler类,方法为publicvoidhandleMessage(Messagemsg),通过判断msg.what可以区分不同的消息类型。根据不同的消息类型,主UI线程会产生不同的动作来响应子线程。4子线程与主线程之间通信的实例该程序的界面如图3所示,界面中存在一个水平进度条和一个大环形进度条,以及一个TextView来显示“界面加载中。。。”。运行中:水平滚动条每1秒前进一格,当进度条的进度达到100%时,TextView显示“页面加载完毕”。分析:要完成这样的任务,需要让程序循环性地休眠1s后,更新水平进度条。但是如果让主程序休眠,会导致界面假死状态,造成