Android中的多线程编程
问题
Android的UI也是线程不安全的,如果要更新应用程序里的UI元素,必须在主线程中进行,否则就会抛异常。比如用一个Button的onClick函数去更新界面上的元素,就会得到一个CalledFromWrongThreadException异常,Android不允许在子线程中进行UI操作。
解决方法
用Android提供的一部消息处理机制:
private Handler handler = new Handler(){
public void handleMessage(Message msg){
switch (msg.what){
case UPDATE_TEXT:
text.setText("Nice to meet you");
break;
default:
break;
}
}
};
Message message = new Message();
message.what = UPDATE_TEXT;
handler.sendMessage(message);
原理
Message是线程之间传递的消息,可以在内部携带少量的信息。Handler是处理这,主要用于发送和处理消息的。MessageQueue是消息队列的iysi,主要用于存放所有通过Handler发送的消息,每一个线程只会有一个MessageQueue对象。Looper是每个线程中的MessageQueue的管家,调用Looper的loop方法后,机会进入一个无限循环中,每当发现MessageQueue中存在消息,就会将它去除,并传递到Handler的handleMessage()方法中。每个线程只有一个Looper对象。
AsyncTask
AsyncTask是比Handler更好的一部处理机制。AsyncTask是一个抽象类,如果想使用它,必须创建一个子类去继承它。同时AsyncTask有三个泛型参数,分别表示要传给后天任务的参数,进度显示单位,反馈执行结果。比如:
class DownloadTask extends AsyncTask<Void, Integer, Boolean>{
...
}
经常需要重写的方法有四个, onPreExecute() 后台任务开始执行之前调用,对界面进行初始化,比如显示进度条 doInBackground 这个方法中的所有代码都会在子线程中运行,处理耗时的任务,一旦完成就通过return语句将执行结果返回。该方法不可以进行UI操作,如果需要更新UI元素,可以调用publishProgress()方法。 onProgressUpdate 当后台任务中调用了publishProgress方法后,这个方法就会被调用,方法中携带的参数就是在后台任务中传过来的,这个方法可以对UI进行草错。 onPostExecute 当后台任务执行完毕并通过return语句返回是,这个方法就会被调用。返回的数据会作为参数传递到此方法中,可以利用返回的数据进行一个UI操作。 如果要启动任务,就new DownloadTask().execute()
Android中的多线程编程的更多相关文章
- Android中的多线程编程(一)附源代码
Android中多线程编程:Handler类.Runnable类.Thread类之概念分析 1.Handler类: Handler是谷歌封装的一种机制:能够用来更新UI以及消息的发送和处理.Handl ...
- JavaEE开发之Spring中的多线程编程以及任务定时器详解
上篇博客我们详细的聊了Spring中的事件的发送和监听,也就是常说的广播或者通知一类的东西,详情请移步于<JavaEE开发之Spring中的事件发送与监听以及使用@Profile进行环境切换&g ...
- Java中的 多线程编程
Java 中的多线程编程 一.多线程的优缺点 多线程的优点: 1)资源利用率更好2)程序设计在某些情况下更简单3)程序响应更快 多线程的代价: 1)设计更复杂虽然有一些多线程应用程序比单线程的应用程序 ...
- Python中的多线程编程,线程安全与锁(二)
在我的上篇博文Python中的多线程编程,线程安全与锁(一)中,我们熟悉了多线程编程与线程安全相关重要概念, Threading.Lock实现互斥锁的简单示例,两种死锁(迭代死锁和互相等待死锁)情况及 ...
- Android中的多线程【转】
感谢大佬:https://www.cnblogs.com/zoe-mine/p/7954605.html 感谢大佬:https://blog.csdn.net/u014555121/article/d ...
- Qt中的多线程编程
http://www.ibm.com/developerworks/cn/linux/l-qt-mthrd/ Qt 作为一种基于 C++ 的跨平台 GUI 系统,能够提供给用户构造图形用户界面的强大功 ...
- C语言中的多线程编程
很久很久以前,我对C语言的了解并不是很多,我最早听说多线程编程是用Java,其实C语言也有多线程编程,而且更为简单.方便.强大.下面就让我们简单领略一下Unix C语言环境下的多线程编程吧! 下面先看 ...
- Android DevArt5:如何在Android中创建多线程?
本篇内容: 如何在Android中创建多进程?查看进程的三种方式有哪些? 多进程模式的运行机制?- 演示了多进程出现问题中的两种情况: 静态成员失效 Application多次创建 IPC基础概念介绍 ...
- .NET 4中的多线程编程之一:使用Task(转载)
原文地址:http://www.cnblogs.com/yinzixin/archive/2011/11/04/2235233.html .NET 4为了简化多线程编程,提供了System.Threa ...
随机推荐
- 美国 ZIP Code 一览表
今天给大家提供美国的Zip Code的原因是大家在注册国外的账号时,需要提供这个Zip Code,因为一般美国的服务默认是面向美国的,甚至是仅支持美国. 以下提供一些美国的zip code 列表. 邮 ...
- C#引用C++开发的DLL
C#语言使用方便,入门门槛较代,上手容易,并且语法与C,java有很类似的地方,IDE做的也好,通用性好,是MS下一代开发的主要力量.但是其开源代码较少,类库不是十分完美,在架构方面还有一些需要做的工 ...
- [bzoj1122][POI2008]账本BBB
1122: [POI2008]账本BBB Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 402 Solved: 202[Submit][Status ...
- 基础笔记10(IO 1.7try-with-resource) 装饰模式
1.读写的类型分为字节流和字符流,字节流一般是视频音频其他所有的类型都可以. (非文档文件使用字符流易造成未知编码(?)错误) InputStream OutputStream 抽象类 fileInp ...
- 【java基础】面向对象的三大特征---多态
java的引用变量有两种类型,编译时类型和运行时类型,如果编译时类型和运行时类型不一致,就会出现多态. 多态分为: 运行时多态 java运行时系统根据调用该方法的实例的类型来决定选择调用哪个方法则被称 ...
- 删除文件夹工具【fuckwinfsdel】,如 node_modules
强力删除文件夹. 安装 npm install fuckwinfsdel -g 使用 fuckwinfsdel youdir 例 fuckwinfsdel node_modules 项目地址 http ...
- linux 记录用户操作记录日志
####################################################################################historyUSER_IP=$ ...
- WPF依赖属性DependencyProperty
写在之前: 依赖属性算是WPF醉醉基础的一个组成了.平时写代码的时候,简单的绑定很轻松,但是遇到复杂的层次比较多的绑定,真的是要命.所以,我觉得深刻认识依赖属性是很有必要的.本篇只是个人学习的记录,学 ...
- Unity3D 中的3种坐标系
Unity3D Script API : Camera 若干文章: 1.Screen VS Viewport What is the difference 2.Screen,Viewport有什麽區別 ...
- iOS:iOS中的多控制器管理
iOS中的控制器有三种创建方式: 1.通过storyboard创建 UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@" ...