一个Android 程序默认情况只有一个进程,但是一个进程可以有多个线程。其中有一个UI 线程也称为UI主线程,UI Thread在Android程序运行的时候就被创建,主要是负责控制UI界面的显示、更新和控件交互。所有的Android应用程序组件----包括Activity、Service、Broadcast Receiver都在应用程序的主线程中运行。因此,任何组件中的费时操作处理都可能阻塞所有其他的组件、包括Service和可见的Activity。

  在Android 中,对未响应的定义是:Activity对一个输入事件在5s内没有响应,或者Broadcast Receiver在10s内没有完成他的onReceive处理程序。对于任何不用直接和用户界面进行交互的重要处理,使用后台线程技术处理是非常重要的,将文件操作、网络交互、数据库、复杂计算调度到后台线程中完成非常重要,以免阻塞主线程。

方法一:Thread+Handler

开启一个新线程:new Thread(new MyThread()).start();

//通过Handler物件,通知主线程UI Thread来更新界面
Handler myHandler=new Handler(){
//此方法主要用于更新UI
public void handleMessage(Message msg){
switch(msg.what){
//根据Thread返回的标识进行相应的处理
}
}
}; class MyThread implements Runnable{
public void run(){
int what=0;
//将耗时操作放到这里处理 //to-do //将标识发给Handler
myHandler.obtainMessage(what).sendToTarget();
}
}

方法二:使用AsyncTask运行异步线程。

  AsyncTask为将耗时操作移到后台线程并在操作完成后同步更新UI线程实现了最佳实践模式。他有助于将事件处理程序与GUI线程进行同步,允许通过更新视图和其他UI元素来报告进度或者在任务完成后发布结果。

  要创建一个新的异步任务,需要扩展AsyncTask类,指定要使用的参数类型:

public class MyAsyncTask extends AsyncTask {

    @Override
protected Object doInBackground(Object... arg0) {
// TODO Auto-generated method stub //将耗时操作放到此方法中来处理
return null;
} @Override
protected void onPostExecute(Object result) {
// TODO Auto-generated method stub //更新UI,起到了handler的作用
} }

运行异步任务:

new MyAsyncTask().execute();

Android UI主线程与子线程的更多相关文章

  1. Android的主线程和子线程

    在一个Android 程序开始运行的时候,会单独启动一个Process.默认的情况下,所有这个程序中的Activity或者Service(Service和 Activity只是Android提供的Co ...

  2. Android线程之主线程向子线程发送消息

    和大家一起探讨Android线程已经有些日子了,谈的最多的就是如何把子线程中的数据发送给主线程进行处理,进行UI界面的更新,为什么要这样,请查阅之前的随笔.本篇我们就来讨论一下关于主线程向子线程如何发 ...

  3. Android 使用handler实现线程间发送消息 (主线程 与 子线程之间)、(子线程 与 子线程之间)

    keyword:Android 使用handler实现线程间发送消息 (主线程 与 子线程之间).(子线程 与 子线程之间) 相信大家平时都有使用到异步线程往主线程(UI线程)发送消息的情况. 本文主 ...

  4. Android笔记(三十二) Android中线程之间的通信(四)主线程给子线程发送消息

    之前的例子都是我们在子线程(WorkerThread)当中处理并发送消息,然后在主线程(UI线程)中获取消息并修改UI,那么可以不可以在由主线程发送消息,子线程接收呢?我们按照之前的思路写一下代码: ...

  5. Handler详解系列(四)——利用Handler在主线程与子线程之间互发消息,handler详解

    MainActivity如下: package cc.c; import android.app.Activity; import android.os.Bundle; import android. ...

  6. C#主线程等待子线程运行结束

    佐左佑右 原文 C#主线程等待子线程运行结束 由于主程序中调用matlab的dll文件进行计算要用较长的时间,主界面会有很长时间的卡顿,造成的用户感受十分不好,因此我想在调用时,将调用放入子线程中,然 ...

  7. Handler具体解释系列(四)——利用Handler在主线程与子线程之间互发消息

    MainActivity例如以下: package cc.c; import android.app.Activity; import android.os.Bundle; import androi ...

  8. [C#参考]主线程和子线程之间的参数传递

    几个进程在大多数情况下要包含很多的子线程,那么他们之间免不了的要互相传递很多的参数,那么参数怎么传递的呢? 主线程向子线程传递参数的方法 第一种方法:Thraed类有一个带参数的委托类型的重载形式,这 ...

  9. (转)C#/.NET主线程与子线程之间的关系

    一般 一个应用程序就对应一个进程,一个进程可有一个或多个线程,而一般有一个主线程.       有的博客上说“至少一个主线程”,这一说法持有怀疑         主线程与子线程之间的关系        ...

随机推荐

  1. Web —— java web 项目 Tomcat 的配置 与 第一个web 项目创建

    目录: 0.前言 1.Tomcat的配置 2.第一个Web 项目 0.前言 刚刚开始接触web开发,了解的也不多,在这里记录一下我的第一个web项目启动的过程.网上教程很多,使用的java IDE 好 ...

  2. Vagrant 部署python开发环境

    Vagrant简介 Vagrant是一个基于Ruby的工具,用于创建和部署虚拟化开发环境.它使用Oracle的开源VirtualBox虚拟化系统,使用 Chef创建自动化虚拟环境. 在Windows下 ...

  3. hdu 1685 Booksort (IDA*)

    Booksort Time Limit: 10000/10000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others) Tot ...

  4. jsp if else c标签 总结

    JSTL标签使用方法 keyword:JSTL标签.<c:choose>.<c:forEach>.<c:forTokens>.<c:if>.<c: ...

  5. 20M宽带的网速等价于多少?

    最近有朋友问我:我家的宽带是20兆的,怎么网速这么慢? 运营商说的20M,完整的单位应该是20Mbps(bps:比特率),而日常中所说的下载速度单位是MB,两者是不一样的. 它们之间的换算关系是:1M ...

  6. mysql的replication(主从同步)总结

    很好的文章,对mysql的主从架构有深入理解. mysql主从同步,从master同步数据到slave慢的情况下,是不是可以改成多线程处理加快同步速度? 参考文章如下: MySQL Replicati ...

  7. 武汉科技大学ACM :1007: 华科版C语言程序设计教程(第二版)习题7.10

    Problem Description 输入n(n<100)个字符串,每个字符串长度不超过1000,将他们按字典顺序输出. Input 多组测试样例. 每组第一行有一个整数n表示有n个字符串. ...

  8. JSTL与EL之间的千丝万缕

    一.关于JSTL和EL: 什么是JSTL? JSTL( JSP Standard Tag Library)是JSP标准 标签库,由apache实现. 什么是EL? EL(Expression Lang ...

  9. InnoDB概览

    InnoDB 采用了MVCC来支持高并发,并且实现了四个标准的隔离级别.其默认级别是REPEATABLE READ(可重复读) ,并且,通过间隙锁(next-key locking)策略防止幻读的出现 ...

  10. MySQL查询优化处理

    查询的生命周期的下一步是将一个sql转化成一个执行计划,MySQL再依照这个执行计划和存储引擎进行交互.这包括多个子阶段:解析sql,预处理,优化sql执行计划.这个过程中任何错误(例如语法错误)都可 ...