问题

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中的多线程编程的更多相关文章

  1. Android中的多线程编程(一)附源代码

    Android中多线程编程:Handler类.Runnable类.Thread类之概念分析 1.Handler类: Handler是谷歌封装的一种机制:能够用来更新UI以及消息的发送和处理.Handl ...

  2. JavaEE开发之Spring中的多线程编程以及任务定时器详解

    上篇博客我们详细的聊了Spring中的事件的发送和监听,也就是常说的广播或者通知一类的东西,详情请移步于<JavaEE开发之Spring中的事件发送与监听以及使用@Profile进行环境切换&g ...

  3. Java中的 多线程编程

    Java 中的多线程编程 一.多线程的优缺点 多线程的优点: 1)资源利用率更好2)程序设计在某些情况下更简单3)程序响应更快 多线程的代价: 1)设计更复杂虽然有一些多线程应用程序比单线程的应用程序 ...

  4. Python中的多线程编程,线程安全与锁(二)

    在我的上篇博文Python中的多线程编程,线程安全与锁(一)中,我们熟悉了多线程编程与线程安全相关重要概念, Threading.Lock实现互斥锁的简单示例,两种死锁(迭代死锁和互相等待死锁)情况及 ...

  5. Android中的多线程【转】

    感谢大佬:https://www.cnblogs.com/zoe-mine/p/7954605.html 感谢大佬:https://blog.csdn.net/u014555121/article/d ...

  6. Qt中的多线程编程

    http://www.ibm.com/developerworks/cn/linux/l-qt-mthrd/ Qt 作为一种基于 C++ 的跨平台 GUI 系统,能够提供给用户构造图形用户界面的强大功 ...

  7. C语言中的多线程编程

    很久很久以前,我对C语言的了解并不是很多,我最早听说多线程编程是用Java,其实C语言也有多线程编程,而且更为简单.方便.强大.下面就让我们简单领略一下Unix C语言环境下的多线程编程吧! 下面先看 ...

  8. Android DevArt5:如何在Android中创建多线程?

    本篇内容: 如何在Android中创建多进程?查看进程的三种方式有哪些? 多进程模式的运行机制?- 演示了多进程出现问题中的两种情况: 静态成员失效 Application多次创建 IPC基础概念介绍 ...

  9. .NET 4中的多线程编程之一:使用Task(转载)

    原文地址:http://www.cnblogs.com/yinzixin/archive/2011/11/04/2235233.html .NET 4为了简化多线程编程,提供了System.Threa ...

随机推荐

  1. selenium 封装代码

    package pers.xeon.automate.auxt; import org.openqa.selenium.By; import org.openqa.selenium.WebElemen ...

  2. solrconfig.xml解析

    solrconfig.xml配置文件主要定义了SOLR的一些处理规则,包括索引数据的存放位置,更新,删除,查询的一些规则配置.下面将对solrconfig进行详细描述:1 <luceneMatc ...

  3. 【网摘】CURL常用命令

    原文地址: http://www.thegeekstuff.com/2012/04/curl-examples/ 下载单个文件,默认将输出打印到标准输出中(STDOUT)中 curl http://w ...

  4. 1004. Counting Leaves (30)

    1004. Counting Leaves (30)   A family hierarchy is usually presented by a pedigree tree. Your job is ...

  5. CSS 制作三角形原理剖析

    使用css制作三角形其实原理很简单,下面一步步解析. 1.html代码如下 <div class="triangle"> </div> 2.CSS代码 .t ...

  6. 更改eclipse的Package Explorer的字体

    说一个牛B的不像实力派的东西 — 更改eclipse的Package Explorer的字体1. 打开eclipse目录/Applications/Eclipse.app/Contents/Eclip ...

  7. My Sql 中要Alter Table的同学请注意!!!

    首先我建议你在对MySQL表做DDL操作时: 1 执行 show processlist 查看,要操作的表(数据库对象)是否处于锁状态 if("未锁定") { 执行DDL语句 }e ...

  8. iOS tabBar双击事件

    思路: 在tabBarController的代理方法 shouldSelectViewController 中, 通过判断tabBar选中的控制器是否是当前控制器 并 比对两次点击的时间间隔 来判断是 ...

  9. angularJS中的ui-router和ng-grid模块

    关于angular的教程,学习了一下angular的ui-router和ng-grid这两个模块,顺便模仿着做了一个小小的东西. 代码已经上传到github上,地址在这里https://github. ...

  10. JSP隐藏过长字段

    <div class="objDiv" title="${fof.fundName }">                        <c ...