android的UI操作不是线程安全的,同时也只有主线程才能够操作UI,同时主线程对于UI操作有一定的时间限制(最长5秒)。为了能够做一些比较耗时的操作(比如下载、打开大文件等),android提供了一些列机制。《android基础知识02——线程安全》系列文章就是参考了网上许多网友的文章后,整理出来的一个系列,介绍了主要的方法。分别如下:
android基础知识02——线程安全1:定义及例子
android基础知识02——线程安全2:handler、message、runnable
android基础知识02——线程安全3:Message,MessageQueue,Handler,Looper
android基础知识02——线程安全4:HandlerThread
android基础知识02——线程安全5: AsyncTask
在上文Timer的例子中,我们提到线程安全这个问题,下面我们来详细介绍一下。
一、线程安全
首先来看一下线程安全的定义:
线程安全:如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的,或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题 。
当一个程序第一次启动的时候,Android会启动一个LINUX进程和一个主线程。默认的情况下,所有该程序的组件都将在该进程和线程中运行 。主线程(Main Thread)主要负责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事 件,并把相关的事件分发到对应的组件进行处理。所以主线程通常又被叫做UI线 程。UI线程才能与Android UI工具包中的组件进行交互,在开发Android应用时必须遵守单线程模型的原则:
Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。
当主线程正在做一些比较耗时的操作的时候,如正从网络上下载一个大图片,或者访问数据库,由于主线程被这些耗时的操作阻塞住,无法及时的响 应用户的事件,从用户的角度看会觉得程序已经死掉。如果程序长时间不响应,用户还可能得重启系统。为了避免这样的情况,Android设 置了一个5秒 的超时时间,一旦用户的事件由于主线程阻塞而超过5秒 钟没有响应,Android会弹出一个应用程序没有响应的对话框。
二、例子
下面将通过一个案例来演示这种情况:
本程序将设计和实现查看指定城市的当天天气情况的功能,
1. 首先,需要选择一个天气查询的 服务接口,目前可供选择的接口很多,诸如YAHOO的 天气API和Google提 供的天气API。 本文将选择GOOGLE 的 天气查询API。 该接口提供了多种查询方式,可以通过指定具体城市的经纬度进行查询,也可以通过城市名称进行查询。
2. 用户在输入框内输入需要查询的 城市名称,然后点击查询按钮
3. 当用户点击查询按钮后,使用已 经内置在Android SDK中的HttpClient API来调用GOOGLE 的 天气查询API, 然后解析返回的指定城市的天气信息,并把该天气信息显示在Title上
主要代码如下:
当用户输入城市名称,然后单击按钮进行查询后,程序会调用Google API的接口获得指定城市的当日天气情况。由于需要访问网络,所以当网络出现异常或者服务繁忙的时候都会使访问网络的动作很耗时。为了要演示超时的现象,只需要制造一种网络异常的状况,最简单的方式就是断开网络连接,然后启动该程序,同时触发一个用户事件,比如按一下MENU键,由于主线程因为网络异常而被长时间阻塞,所以用户的按键事件在5秒 钟内得不到响应,Android会 提示一个程序无法响应的异常。
三、子线程
Android的UI是单线程(Single-threaded)的。为了避免拖住GUI,一些较费时的对象应该交给独立的线程去执行。但幕后的线程来执行UI对象,Android就会发出错误讯息 CalledFromWrongThreadException。
像上例一样由主线程来负责执行 该操作是错误的。所以我们需要在onClick方 法中创建一个新的子线程来负责调用GOOGLE API来获得天气数据。刚接触Android的 开发者最容易想到的方式就是如下:
你会发 现Android会 提示程序由于异常而终止。为什么在其他平台上看起来很简单的代码在Android上运行的时候依然会出错呢?如果你观察LogCat中打印的日志信息就会发现这样的错误日志:
android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
从错误信息不难看出Android禁 止其他子线程来更新由UI thread创建的试图。本例中显示天气信息的title实际是就是一个由UI thread所创建的TextView,所以参试在一个子线程中去更改TextView的时候就出错了。这显示违背了单线程模型的原则:Android UI操作并不是线程安全的并且这些操作必须在UI线 程中执行
分享到:
相关推荐
1. **JNI基础知识** - JNI接口定义了一组函数,这些函数允许Java代码创建、访问和操作本地方法。 - 在Java代码中,我们需要定义一个native方法,比如`native void doSomething();`,然后使用`System.loadLibrary(...
【标题】中的“安卓Android源码——ViewFlowTest 完美实现gallry轮训效果!!!”表明这是一个关于Android开发的项目,具体是利用ViewFlow库实现了一个类似于Gallery的轮播效果。Gallery在早期的Android版本中是一个...
1. **Android Studio**:作为Android开发的主要集成开发环境(IDE),Android Studio提供了代码编辑、调试、构建工具等全面功能,是开发者的首选工具。 2. **布局设计**:在创建“宝宝购买装备”应用时,开发者会...
1. **Web Service基础**: Web Service是一种基于HTTP协议的应用程序接口(API),允许不同系统之间的数据交换。常见的Web Service类型有SOAP(Simple Object Access Protocol)和REST(Representational State ...
在Android开发领域,掌握基础知识和实践经验至关重要。"android笔记和第一个例子的代码"是一个很好的起点,它涵盖了Android应用开发的基本概念和实战经验。这个主题主要包含两个方面:理论学习和实际编码。 首先,...
一、JSON基础知识 JSON是一种基于文本的格式,其数据结构主要由键值对(对象)和数组组成。对象以大括号{}包围,键值对以冒号:分隔,各对之间用逗号,隔开。数组则以方括号[]表示,元素之间同样用逗号分隔。例如: `...
1. **Android应用框架**:任何Android应用的基础都是Android应用程序框架,它包含了各种组件如Activity、Service、BroadcastReceiver和ContentProvider。在这个案例中,Activity是用户与游戏交互的主界面,可能包含...
----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...
CruiseYoung提供的带有详细书签的电子书籍目录 ... 该资料是《Android高级编程》的源代码 ...本书的内容和示例提供了如何使用当前SDK来编写优秀的移动程序所需要的基础知识,同时也保持了快速适应未来版本...
这个源码提供了一个很好的机会来学习Android应用程序开发的基础知识,包括网络请求、数据解析、UI设计以及事件处理。下面将详细阐述这些知识点。 1. **Android Studio**:首先,你需要一个集成开发环境(IDE)——...
本资源包"安卓动画效果相关-Android闪闪发光字体Shimmer效果.rar"聚焦于一种特殊的动画效果——Shimmer效果,这种效果通常用于模拟文字或图像的闪烁、流动感,给用户带来视觉上的吸引力。Shimmer动画在界面设计中常...
这个压缩包提供的源码是一个基础的图形程序,它展示了如何在Android上创建交互式的图形界面,特别是处理触摸事件。让我们深入了解一下其中涉及的关键知识点。 首先,Android应用的基本结构是围绕Activity展开的。...
- **webrtc代码相关基础知识**:讲解了一些重要的编程概念和技术。 - **STUN和TURN技术浅析**:对这两种技术进行了简要分析。 - **基于ICE的VoIP穿越NAT改进方案**:提出了一些改进措施。 - **ubuntu安装使用...
- **基础概念**:Webrtc开发所需的基础知识。 - **编程技巧**:Webrtc开发中的编程技巧。 - **7.5 STUN和TURN技术浅析** - **原理**:STUN和TURN技术的工作原理。 - **应用场景**:STUN和TURN技术的应用场景。 -...
本篇文章将深入剖析Qt的一个例程——WorldTimeClockBuilder,以此为例,详细阐述Qt的关键知识点。 1. **Qt基本概念** - **Qt库**:Qt库包含了大量预定义的类,用于构建图形用户界面、网络通信、数据库连接、XML...
它涵盖了GUI设计、事件处理、数据库操作等多个方面,是实践理论知识的好例子。对于进行毕业设计或课程设计的学生,可以参考此项目来理解如何将课堂所学应用于实际项目。同时,对于有经验的开发者,这个简单的联系人...
首先,让我们来看看Java的基础知识。Java是一种面向对象的编程语言,由Sun Microsystems(现已被Oracle收购)在1995年发布。它的设计目标是“一次编写,到处运行”(Write Once, Run Anywhere),这得益于Java虚拟机...