- 浏览: 83872 次
- 性别:
- 来自: 成都
最新评论
-
284772894:
好文章,谢谢
android硬件传感器 -
康妮西:
求这个View的解释望博主联系,我的联系方式:kangnixi ...
让scrollview在滚动的过程中自动定位页的边边 -
muyu114:
你这个是啥意思啊,有什么效果没有
让scrollview在滚动的过程中自动定位页的边边
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中:
----------------------------------------------------------------------
----------------------------------------------------------------------
一开始, 这段代码看起来是个不错的解决方案, 因为它不会阻塞线程. 不幸的是, 它破坏了UI的单线程模型: Android UI工具不是线程安全的, 必须在UI线程中操作. 在上面的代码段中, ImageView在一个工作线程中操作, 这回导致很奇怪的问题. 追踪和解决这样的bug是非常困难的.
Android提供了一些从其它线程中访问UI线程的方法. 你可能已经对它们之中的某些比较熟悉了:
你可以使用上面的任意一种类和方法来改正之前的错误:
----------------------------------------------------------------------
----------------------------------------------------------------------
不幸的是, 这些类和方法也会使你的代码更加复杂. 如果你需要实现频繁的UI更新的话就更糟糕了.
为解决这个问题, Android1.5以上的平台提供了一个叫做AsyncTask的工具类.
Android1.0和1.1上也有和它等效的类叫做UserTask, 它提供了完全一样的接口.
AsyncTask的作用是帮你来管理线程. 我们将之前的例子用AsyncTask来重写:
----------------------------------------------------------------------
----------------------------------------------------------------------
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.)
你可以在任何线程中取消该工作.
无论你是否使用 AsyncTask, 记住以下关于单线程模型的两条规则:
不要阻塞UI线程, 以及
确定你只在UI线程中访问Android UI 工具.
AsyncTask 只是让上面两件事情变得更加方便
[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_SDK_NDK_JNI
2014-09-10 12:26 720Android SDK、NDK、JNI的简 ... -
如何检查apk是否签名
2012-02-22 16:46 2481Use this command : (Jarsigner i ... -
切割bitmap
2011-11-15 16:09 970Bitmap resource = BitmapFactory ... -
TextView控件属性列表
2011-10-08 15:58 1168纯属转载: http://www.cnbl ... -
元数据Meta Data
2011-09-30 16:30 1139<meta-data andr ... -
系统自带样式Android:theme
2011-06-23 15:58 2253Android应用开发——系统自带样式Android:them ... -
EditText自动获取焦点并弹出输入法的问题
2011-06-16 16:25 50371.每次启动新的Activity的时候,输入法总是弹出来,太烦 ... -
Service Broadcast BroadcastReceiver AlarmManager,Notification利用service定时/周期性发送广播
2011-05-31 16:35 38691.如题 主要实现 1.启动service,关 ... -
android硬件传感器
2011-05-30 16:07 13368纯属转载:http://dev.10086 ... -
权限permission
2011-05-27 18:03 1276纯属于转载: http://blog.csdn.net/ ... -
读写系统设置——日期与时间使用网络提供的值(时间与网络同步)
2011-05-27 17:19 2529//读_1.带默认参数的 Settings.Syste ... -
读写系统设置
2011-05-27 17:13 1806Android的很多设置想关的东西都存储在数据库中 andro ... -
Display_获取屏幕宽高
2011-05-06 12:19 969public static void intScreen(A ... -
seletctAll___利用ScrollView+RadioGroup+RadioButton实现相似互斥
2011-05-03 17:58 2088假如你有多个匹配list,在这些匹配list中存在这样的一些匹 ... -
selectAll___CheckBox in ListView
2011-05-03 17:32 14531.如果你有一个ListView,listView的 adap ... -
Layout___模块重用之include布局整合
2011-04-06 14:04 1356在Android的开发中,我们知道布局文件可以让我们很 ... -
value-string
2011-04-06 13:36 2086我们知道在android的value文件夹下,string.x ... -
利用PorterDuff.Mode做橡皮擦效果
2011-04-01 18:03 10756http://stackoverflow.com/questi ... -
UI___tab view 的实现
2011-03-24 15:19 1978一.通过xml文件实现 1.创建一个tab iew,所需的x ... -
常用的html特殊符号转义符
2011-03-24 14:40 2217HTML特殊转义字符列表,最常用的字符实体 Character ...
相关推荐
在Android开发中,UI设计是至关重要的一环,它直接影响到应用程序的用户体验。这个"Android UI控件组件库集合【源码】"提供了多种常用的UI控件及其源代码,旨在帮助开发者构建更加美观、功能丰富的应用界面。下面...
《Android UI设计》面向创建移动应用的产品经理、设计师和开发者,系统讲解了从事Android UI设计必须要掌握的Android平台的主要技术和特性,全面总结了Android UI的设计原理、设计理念和设计模式,并通过一个综合的...
Android UI 设计器是Android开发中的一个重要工具,它允许开发者直观地设计应用程序的用户界面,无需手动编写XML布局代码。这个工具极大地提升了开发效率,使得非程序员也能参与到UI设计中来,实现快速预览和调整...
android UI 生成器 可以生成android的UI减轻工作,比eclipse内置的好多了,直接生成布局文件拉人项目直接使用
在Android平台上进行UI界面开发时,图片资源是至关重要的元素,它们不仅决定了应用的视觉吸引力,也直接影响用户体验。本文将围绕“Android UI界面开发图片”这一主题,深入探讨相关知识点,帮助开发者创建出美观且...
在Android平台上进行UI设计是一项既具有挑战性又充满创意的工作。设计良好的用户界面不仅可以提升用户体验,还能使应用程序更具吸引力和易用性。以下是对标题和描述中提到的几个关键知识点的详细阐述: 1、**该做...
在Android平台上进行UI(用户界面)设计是一项至关重要的任务,因为优秀的UI设计能够极大地提升用户体验,从而增加应用程序的吸引力和用户满意度。为了帮助开发者和设计师高效地创建美观且易用的Android界面,有许多...
精通ANDROID UI设计
《Android应用程序开发教程(第2版)》教学课件02Android UI设计.pdf《Android应用程序开发教程(第2版)》教学课件02Android UI设计.pdf《Android应用程序开发教程(第2版)》教学课件02Android UI设计.pdf《Android应用...
在Android平台上,UI(用户界面)定制是一项关键的技术任务,它允许开发者根据需求和品牌风格创建独特的用户体验。这里,我们探讨的是"android UI定制的一些资料",这些资料可能包括设计原则、布局技巧、自定义视图...
在Android开发领域,UI设计是至关重要的,因为它直接影响到应用的用户体验和吸引力。"android-UI.zip"这个压缩包提供了一套精美的Android UI设计样例,为开发者提供了丰富的参考素材,帮助他们创造出更加吸引人的...
本书详细阐述了与 Android UI开发相关的基本解决方案,主要包括 Android UI设计工具, Android UI布局, Android UI Widgets,Android UI选项菜单, Android UI本地菜单, Android UI操作栏, Android UI设计考虑, ...
在Android开发中,UI设计是至关重要的,因为它直接影响到用户对应用的第一印象和使用体验。本文将深入探讨如何自己设计一个精美的布局,基于Android UI设计原则和源码实现。我们将从以下几个方面来展开讨论: 1. **...
【Android UI设计官方教程(CHM)】是一个专门为Android开发者和设计师准备的离线资源,它涵盖了Google官方的Android UI设计指南。这个教程包含了丰富的信息,帮助用户理解并创建高效、美观且用户友好的Android应用...
在Android应用开发中,UI(用户界面)设计是至关重要的,因为它直接影响到用户的体验和对应用的第一印象。本文将深入探讨Android平台上的UI设计工具及其使用方法,帮助开发者和设计师们创造出美观、易用的界面。 一...
在安卓(Android)开发中,UI界面是用户体验的关键部分,其源码的解析与理解对于开发者来说至关重要。这个名为“安卓Android源码——UI界面源码.zip”的压缩包,很显然是一个包含Android用户界面(UI)相关源代码的...
《Android UI设计基础》是Jason Ostrander撰写的一本深入探讨Android用户界面设计的专业书籍,由Peachpit Press出版。本书旨在为读者提供全面而深入的Android UI设计知识,涵盖从设计理论到实际开发的各个环节,是...
Android UI界面源码是开发Android应用程序时不可或缺的一部分。在Android平台上,用户界面(UI)的设计和实现对于提供良好的用户体验至关重要。这份"Android UI界面源码.zip"压缩包可能包含了一系列用于构建Android...
在Android开发中,UI框架是构建用户界面的关键组成部分。这个实例项目“android UI框架 实例项目 demo”提供了实际操作的代码示例,帮助开发者更好地理解和应用Android的UI设计。源码的存在使得我们可以直接运行和...
在Android应用开发中,UI(用户界面)组件是构建应用程序不可或缺的部分。这些组件构成了用户与应用交互的视觉元素。以下是对“android ui组件大全”这个主题的详细解析: 标题:“android ui组件大全” 这个标题...