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 ...
随机推荐
- java 调用axis2 webservice
import org.apache.axiom.om.OMAbstractFactory; import org.apache.axiom.om.OMElement; import org.apach ...
- Android studio Gradle 教程
一 . Gradle基础:https://segmentfault.com/a/1190000002439306 module下的gradle文件: // 声明是Android程序 apply plu ...
- Javascript运用函数计算正方形的面积
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- hihoCoder 1432 : JiLi Number(吉利数)
hihoCoder #1432 : JiLi Number(吉利数) 时间限制:1000ms 单点时限:1000ms 内存限制:256MB Description - 题目描述 Driver Ji l ...
- stst
静态代码块如果不要static 那么只要生成新的该对象,则会执行{}内的代码 super.onDestroy() 先后顺序问题 Ctrl + Alt + F refromat code目前看来不能对代 ...
- C# 只移除最后一个字符
string str = "|||"; Console.WriteLine(str.Substring(0, str.Length - 1)); Console.WriteLine ...
- Unity3d外包(北京)公司(长年承接U3D外包)
我们制作各类型严肃游戏,虚拟现实,增强现实项目! 品质保证,售后完备. 联系请加QQ:372900288 电话:13911652504 我们团队成立于2011年10月,是一个专业从事严肃游戏研发的团 ...
- iBatis框架基本使用
iBatis框架是Java持久层开发框架,说白了就是前人写了一部分代码(针对数据库操作),我们要做的就是再次开发,拿来框架直接使用. 我们自己开发时,dao层的sql语句都是写死在程序中的,如果查询条 ...
- 在控制台启动服务器时出现:对于服务器soa1_wls, 与计算机oim1相关联的节点管理器无法访问。
问题:在控制台启动服务器时出现:对于服务器soa1_wls, 与计算机oim1相关联的节点管理器无法访问.原因:nodemanager没有启起来解决方法: 一.对于managedServer于admi ...
- SAP采购订单历史明细报表源代码(自己收藏)
SPAN { font-family: "Courier New"; font-size: 10pt; color: #000000; background: #FFFFFF } ...