android技术部分相关线程模式_第1页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

2、一个线程中执行,如果执行一些耗时的操作,如网络或查询数据库,会阻塞整个用户界面。当在执行一些耗时的操作的时候,不地分发事件,包括用户界面重绘事件。从用户的角度来看,应用程序看上去像挂掉了。更糟糕的是,如果阻塞应用程序的时间过长(现在大概是 5 秒钟)Android 会向用户提示一些信息,即打开一个“应用程序没有相应(application not responding)”的框。如果你想知道这有多糟糕,写一个简单的含有一个按钮的程序,并为按钮一个单击事件,并在事件处理器中调用这样的代码Thread.sleep(2000)。在按下这个按钮这后恢复按钮的正常状态之前,它会保持按下状态大概 2 秒钟。

3、如果这样的情况在你编写的应用程序中发生,用户的第一反应就是你的程序运行很慢。现在你知道你应该避免在UI 线程中执行耗时的操作,你很有可能会在线程或工作者线程中执行这些耗时的任务,这一副并使用 ImageView 来展现这幅图样做是否正确呢?让来看一个例子,在这个例子中按钮的单击事件从网络上片。代码如下:view sourcepr ?1 public void onClick( View v ) 23456789 new Thread(new Runnable() public void run() Bitmap b = loadImageFromNetwork(); mImageView.se

4、tImageBitmap( b );).start();这段代码好像很好地解决了你遇到,因为它不会阻塞 UI 线程。很不幸,它违背了单线程模型:Android UI 操作并不是线程安全的并且这些操作必须在UI 线程中执行。在这段代码片段中,在一个工作者线程中使用 ImageView 的方法,这回引起一些很古怪。查处这个问题并修复这个 bug 会很而且也很耗时。Andriod 提供了几种在其他线程中UI 线程的方法。或许你已经对其中的一些方式很熟悉,但下面是一个更全面的列表:Activity.runOnUiThread( Runnable ) View.t( Runnable ) View.tD

5、elayed( Runnable, long ) Hanlder上面的任何一个类或方法都可以修复前面代码中出现。view sourcepr ?01 public void onClick( View v ) 02030405060708091011 new Thread(new Runnable() public void run() final Bitmap b = loadImageFromNetwork(); mImageView.t( new Runnable() mImageView.setImageBitmap( b ););).start();很不幸的是这些类或方法同样会使你的代

6、码很复杂很难理解。然而当你需要实现一些很复杂的操作并需要频繁地更新 UI时这会变得更糟糕。为了解决这个问题,Android 1.5 提供了一个工具类:Asynk,它使创建需要与用户界面交互的长时间运行的任务变得更简单。在Android 1.0 和 1.1 中具有与Asyn代码拷贝的你的程序中。k 相同功能的类UserTask。它提供了完全一样的 API,你需要做的只是把它的Asynk 的目标是替你管理你的线程。前面的代码可以很容易地使用 Asynk 重写。view sourcepr ?01 public void onClick( View v ) 02new DownloadImageTas

7、k().execute( /image.png );03 private class DownloadImageTask extends Asynk 04050607080910protected BitmapnBackground( String. urls ) return loadImageFormNetwork( urls0 );protected void ontExecute( Bitmap result ) mImageView.setImageBitmap( result );正如你看到的,使用 Asynk 必须要继承它。使用 Asynk 非常重要的是:Asynk 的实例必须在

8、UI 线程中创建而且只能被使用一次。你可以使用预读Asynk 的文档来来了解如何使用这个类,下面大概地了解一下它是如何工作的:你可以使用泛型参数制定任务的参数、中间值(progress values)和任何的最终执行结果nBackground()方自动地在工作者线程中执行 onPreExecute()、ontExecute()和onProgrepdate()方在UI 线程中被调用nBackground()方法的返回值会被传递给ontExecute()方法 在nBackground()方法中你可以调用publishProgress()方法,每一次调用都会使UI 线程执行一次onProgrepdate()方法 你可以在任何时候任何线程中取消这个任务除了的文档,你可以阅读Shelves 和Photostream 源代码中的几个复杂的示例。我强烈地码,它会使你知道如何在配置更改之间持久化任务以及在

温馨提示

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

评论

0/150

提交评论