`
aliusa
  • 浏览: 84258 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Android UI Operation in Thread

阅读更多
Android UI Operation in Thread

[color=red]纯属转载http://hi.baidu.com/hi_android/blog/item/317526ea03c29f06fcfa3cc6.htmlcolor]

本文讨论Android应用程序的线程模型以及应用程序应该如何创建工作线程而不是使用主线程来处理长期运行的操作, 以得到好的UI性能. 本文还解释了你可以用来和Android UI组件交互以及创建线程的 API.

The UI thread UI 线程
当一个应用程序启动时, 系统创建一个叫做"main"的线程. 这个主线程也叫UI线程, 它非常重要, 因为它负责将事件分发给合适的widget来处理, 包括绘图事件等. 它也是你的应用程序和运行中的Android UI组件进行交互的线程. 例如, 如果你按下屏幕上的按钮, UI线程会将这个触摸事件分配给该widget, 而该widget将设置它的按下状态并向事件队列一个重绘请求. UI线程从队列中取出请求并通知widget来重画自身.

单线程模型可能会导致性能很差, 除非你的程序被正确的实现. 特别的, 如果每件事都在同一个线程中进行, 那么耗时长的操作(例如网络访问和数据库查询)将阻塞UI线程, 从而使整个UI无法交互. 在耗时操作进行时, 包括绘画事件在内的所有事件都无法进行分配. 在用户看来, 该应用程序停止了响应. 更糟糕的是, 如果UI线程被阻塞超过一段时间(当前的限制是5秒钟), 那么用户将看到"应用程序无响应"的对话框.

如果你希望看看这是多么的糟糕, 那么你可以写一个程序, 创建一个按钮, 它的OnClickListener中调用Thread.sleep(2000). 那么该按钮在按下去以后要等2秒才会谈起, 这时候用户是非常容易感觉到程序很慢.

总之, 应用程序UI的响应速度是很重要的, 所以应该避免阻塞UI线程. 如果你需要进行耗时操作, 那么你应该在其他的线程中进行(后台或者工作线程).

下面的例子演示了如何实现一个单击监听器来下载一个图片并将它显示在 ImageView中:


----------------------------------------------------------------------
public void onClick(View v) {
new Thread(new Runnable() {
public void run() {
Bitmap b = loadImageFromNetwork();
mImageView.setImageBitmap(b);
}
}).start();
}


----------------------------------------------------------------------
一开始, 这段代码看起来是个不错的解决方案, 因为它不会阻塞线程. 不幸的是, 它破坏了UI的单线程模型: Android UI工具不是线程安全的, 必须在UI线程中操作. 在上面的代码段中, ImageView在一个工作线程中操作, 这回导致很奇怪的问题. 追踪和解决这样的bug是非常困难的.

Android提供了一些从其它线程中访问UI线程的方法. 你可能已经对它们之中的某些比较熟悉了:

Activity.runOnUiThread(Runnable) 
View.post(Runnable) 
View.postDelayed(Runnable, long) 
Handler 

你可以使用上面的任意一种类和方法来改正之前的错误:


----------------------------------------------------------------------
public void onClick(View v) {
new Thread(new Runnable() {
public void run() {
final Bitmap b = loadImageFromNetwork();
mImageView.post(new Runnable() {
public void run() {
mImageView.setImageBitmap(b);
}
});
}
}).start();
}


----------------------------------------------------------------------
不幸的是, 这些类和方法也会使你的代码更加复杂. 如果你需要实现频繁的UI更新的话就更糟糕了.

为解决这个问题, Android1.5以上的平台提供了一个叫做AsyncTask的工具类.

Android1.0和1.1上也有和它等效的类叫做UserTask, 它提供了完全一样的接口.

AsyncTask的作用是帮你来管理线程. 我们将之前的例子用AsyncTask来重写:


----------------------------------------------------------------------
public void onClick(View v) {
new DownloadImageTask().execute("http://example.com/image.png");
}

private class DownloadImageTask extends AsyncTask<string, void,="" bitmap=""> {
protected Bitmap doInBackground(String... urls) {
return loadImageFromNetwork(urls[0]);
}

protected void onPostExecute(Bitmap result) {
mImageView.setImageBitmap(result);
}
}


----------------------------------------------------------------------
AsyncTask必须使用创建子类的方式来使用. AsyncTask实例只能在UI线程中创建,并且只能运行一次. AsyncTask documentation 中有它的详细介绍, 这里简单介绍一下:

你可以使用泛型来指定任务的参数的类型, 过程值和最终值. (不知道理解的对不对 You can specify the type, using generics, of the parameters, the progress values and the final value of the task.)
doInBackground() 方法自动运行在一个工作线程中. 
onPreExecute(), onPostExecute() 和onProgressUpdate() 都在UI线程中工作. 
 doInBackground() 的返回值被传给 onPostExecute()你可以在任何时间在doInBackground()中调用publishProgress() 来在 UI 线程中运行 onProgressUpdate() .


你可以在任何线程中取消该工作.
无论你是否使用 AsyncTask, 记住以下关于单线程模型的两条规则:

不要阻塞UI线程, 以及
确定你只在UI线程中访问Android UI 工具.

AsyncTask 只是让上面两件事情变得更加方便
分享到:
评论

相关推荐

    Android UI控件组件库集合【源码】

    在Android开发中,UI设计是至关重要的一环,它直接影响到应用程序的用户体验。这个"Android UI控件组件库集合【源码】"提供了多种常用的UI控件及其源代码,旨在帮助开发者构建更加美观、功能丰富的应用界面。下面...

    《Android UI设计》PDF

    《Android UI设计》面向创建移动应用的产品经理、设计师和开发者,系统讲解了从事Android UI设计必须要掌握的Android平台的主要技术和特性,全面总结了Android UI的设计原理、设计理念和设计模式,并通过一个综合的...

    android UI界面开发图片

    在Android平台上进行UI界面开发时,图片资源是至关重要的元素,它们不仅决定了应用的视觉吸引力,也直接影响用户体验。本文将围绕“Android UI界面开发图片”这一主题,深入探讨相关知识点,帮助开发者创建出美观且...

    Android UI基础教程 高清带标签pdf

     《AndroidUI基础教程》是一本Android用户界面设计的基础入门图书。全书从最基础的技术概念开始介绍,深入讨论了UI设计的各项技术,涵盖了为应用程序创建UI的所有内容。本书不仅会告诉读者创建灵活布局的最佳方法,...

    android UI界面设计

    Android UI 界面设计 Android UI 界面设计是一种基于 Android 平台的用户界面设计方法,旨在为用户提供简洁、美观、易用的界面设计体验。下面是 Android UI 界面设计的相关知识点: 一、UI 设计 9 要素 1. 为高...

    android UI大全

    在Android开发领域,UI设计是至关重要的一环,它关乎到应用程序的用户体验和视觉吸引力。"android UI大全"这个资源包,显然集成了多种Android用户界面元素的源码和示例,旨在帮助初学者快速入门,并为面试做准备。让...

    ANDROID UI设计工具

    在Android平台上进行UI(用户界面)设计是一项至关重要的任务,因为优秀的UI设计能够极大地提升用户体验,从而增加应用程序的吸引力和用户满意度。为了帮助开发者和设计师高效地创建美观且易用的Android界面,有许多...

    精通ANDROID UI设计

    精通ANDROID UI设计

    android UI定制的一些资料

    在Android平台上,UI(用户界面)定制是一项关键的技术任务,它允许开发者根据需求和品牌风格创建独特的用户体验。这里,我们探讨的是"android UI定制的一些资料",这些资料可能包括设计原则、布局技巧、自定义视图...

    《精通Android UI设计》

    本书详细阐述了与 Android UI开发相关的基本解决方案,主要包括 Android UI设计工具, Android UI布局, Android UI Widgets,Android UI选项菜单, Android UI本地菜单, Android UI操作栏, Android UI设计考虑, ...

    android ui源码:自己设计的一个精美布局

    在Android开发中,UI设计是至关重要的,因为它直接影响到用户对应用的第一印象和使用体验。本文将深入探讨如何自己设计一个精美的布局,基于Android UI设计原则和源码实现。我们将从以下几个方面来展开讨论: 1. **...

    Android新手UI集合全

    在Android开发领域,UI设计是至关重要的一环,它直接影响到应用程序的用户体验和视觉吸引力。"Android新手UI集合全"这个资源包,显然为初学者提供了一整套的UI设计元素,帮助他们快速理解和实践Android应用界面的...

    Android UI设计官方教程(CHM)

    【Android UI设计官方教程(CHM)】是一个专门为Android开发者和设计师准备的离线资源,它涵盖了Google官方的Android UI设计指南。这个教程包含了丰富的信息,帮助用户理解并创建高效、美观且用户友好的Android应用...

    Android UI设计工具

    在Android应用开发中,UI(用户界面)设计是至关重要的,因为它直接影响到用户的体验和对应用的第一印象。本文将深入探讨Android平台上的UI设计工具及其使用方法,帮助开发者和设计师们创造出美观、易用的界面。 一...

    android UI界面编辑器

    在Android开发领域,UI界面是用户体验的关键因素,而“Android UI界面编辑器”则是开发者们进行高效、直观设计的重要工具。这个编辑器允许开发者通过拖放控件的方式,轻松创建和布局应用程序的用户界面,同时生成...

    android UI设计(Android UI Fundamentals)

    《Android UI设计基础》是Jason Ostrander撰写的一本深入探讨Android用户界面设计的专业书籍,由Peachpit Press出版。本书旨在为读者提供全面而深入的Android UI设计知识,涵盖从设计理论到实际开发的各个环节,是...

    安卓Android源码——UI界面源码.zip

    在安卓(Android)开发中,UI界面是用户体验的关键部分,其源码的解析与理解对于开发者来说至关重要。这个名为“安卓Android源码——UI界面源码.zip”的压缩包,很显然是一个包含Android用户界面(UI)相关源代码的...

    Android UI界面源码.zip

    Android UI界面源码是开发Android应用程序时不可或缺的一部分。在Android平台上,用户界面(UI)的设计和实现对于提供良好的用户体验至关重要。这份"Android UI界面源码.zip"压缩包可能包含了一系列用于构建Android...

    android UI框架 实例项目 demo

    在Android开发中,UI框架是构建用户界面的关键组成部分。这个实例项目“android UI框架 实例项目 demo”提供了实际操作的代码示例,帮助开发者更好地理解和应用Android的UI设计。源码的存在使得我们可以直接运行和...

Global site tag (gtag.js) - Google Analytics