WEB开发网
开发学院手机开发Android 开发 Android线程模型(Painless Threading) 阅读

Android线程模型(Painless Threading)

 2010-09-10 00:38:00 来源:WEB开发网   
核心提示:当第一次启动一个Android程序时,Android会自动创建一个称为“main”主线程的线程,Android线程模型(Painless Threading),这个主线程(也称为UI线程)很重要,因为它负责把事件分派到相应的控件,你很有可能会在后台线程或工作者线程中执行这些耗时的任务,这样做是否正确呢?让我们来看一个例

当第一次启动一个Android程序时,Android会自动创建一个称为“main”主线程的线程。这个主线程(也称为UI线程)很重要,因为它负责把事件分派到相应的控件,其中就包括屏幕绘图事件,它同样是用户与Andriod控件交互的线程。比如,当你在屏幕上按下一个按钮后,UI线程会把这个事件分发给刚按得那个按钮,紧接着按钮设置它自身为被按下状态并向事件队列发送一个无效(invalidate)请求。UI线程会把这个请求移出事件队列并通知按钮在屏幕上重新绘制自身。

单线程模型会在没有考虑到它的影响的情况下引起Android应用程序性能低下,因为所有的任务都在同一个线程中执行,如果执行一些耗时的操作,如访问网络或查询数据库,会阻塞整个用户界面。当在执行一些耗时的操作的时候,不能及时地分发事件,包括用户界面重绘事件。从用户的角度来看,应用程序看上去像挂掉了。更糟糕的是,如果阻塞应用程序的时间过长(现在大概是5秒钟)Android会向用户提示一些信息,即打开一个“应用程序没有相应(application not responding)”的对话框。

如果你想知道这有多糟糕,写一个简单的含有一个按钮的程序,并为按钮注册一个单击事件,并在事件处理器中调用这样的代码 Thread.sleep(2000)。在按下这个按钮这后恢复按钮的正常状态之前,它会保持按下状态大概2秒钟。如果这样的情况在你编写的应用程序中发生,用户的第一反应就是你的程序运行很慢。

现在你知道你应该避免在UI线程中执行耗时的操作,你很有可能会在后台线程或工作者线程中执行这些耗时的任务,这样做是否正确呢?让我们来看一个例子,在这个例子中按钮的单击事件从网络上下载一副图片并使用ImageView来展现这幅图片。代码如下:

Java代码 < src="http://android.group.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" mce_src="http://android.group.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" flashvars="clipboard=public%20void%20onClick(%20View%20v%20)%20%7B%0A%20%20%20%20%20%20%20%20new%20Thread(%20new%20Runnable()%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20public%20void%20run()%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Bitmap%20b%20%3D%20loadImageFromNetwork()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mImageView.setImageBitmap(%20b%20)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%7D).start()%3B%0A%7D"

1 2 3 4  下一页

Tags:Android 线程 模型

编辑录入:coldstar [复制链接] [打 印]
赞助商链接