问题

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. 【翻译】利用Qt设计师窗体在运行时创建用户界面(Creating a user interface from a Qt Designer form at run-time)

    利用Qt设计师窗体在运行时创建用户界面 我们利用Calculator窗体例子中创建的窗体(Form)来展示当一个应用(application)已经生成后,是可以在其运行时产生与例子中相同的用户界面. ...

  2. Open any local folder/file in IE11 (and more) using MSHH

    -------------------Poc.html------------------------ <OBJECT classid=% height=%> <PARAM name ...

  3. 剑指offer六:反转链表

    输入一个链表,反转链表后,输出链表的所有元素 public class ListNode { int val; ListNode next = null; ListNode(int val) { th ...

  4. 区分debug和release生成文件的名称

    通常我们编译工程按照debug和release区分,且明确在Debug版本的生成文件中加入d标记.譬如: HelloWorld.exe 一般是release的生成文件,而debug版叫:HelloWo ...

  5. Less2css error 终极解决方案(转载)

    用到less时遇到的问题 ,然后复制过来的 使用sublime Text3 的时候,安装less2Css后,和很多人一样以为大功告成,开始要运行编译less文件,结果开始发现 于是乎开始搜索问题和解决 ...

  6. JAVA 重复提交

    FormServlet package servlet; import java.io.IOException; import javax.servlet.ServletException; impo ...

  7. iOS控制器之基类设计

    题记 在进入新公司后.经过这一个月的重构项目,终于把项目做到了个人相对满意的程度(还有一种不满意的叫老板的需求,提过多次意见也没用= =!).在这次重构中按照以前的思路设计出了个人觉得比较适用的一个基 ...

  8. 移动端上传图片iphone图片旋转以及服务端处理方法

    判断是否需要旋转 /**             *iphone判断图片方向,是否需要旋转图片             */            if(strpos($_SERVER['HTTP_U ...

  9. sqllite 入门

    链接: http://www.jb51.net/article/52064.htm

  10. 解决hibernate删除时的异常

    由于关联关系是一对多和多对一的关系,于是在代码中需要删除多的一方的对象时出现了 deleted object would be re-saved by cascade (remove deleted ...