Android Handler主线程和一般线程通信的应用分析

2016-02-19 10:10 4 1 收藏

下面是个超简单的Android Handler主线程和一般线程通信的应用分析教程,图老师小编精心挑选推荐,大家行行好,多给几个赞吧,小编吐血跪求~

【 tulaoshi.com - 编程语言 】

Handler的定义:主要接受子线程发送的数据, 并用此数据配合主线程更新UI.
解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发, 比如说, 你要是点击一个 Button ,Android会分发事件到Button上,来响应你的操作。如果此时需要一个耗时的操作,例如: 联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,如果你放在主线程中的话,界面会出现假死现象, 如果5秒钟还没有完成的话,会收到Android系统的一个错误提示"强制关闭"。这个时候我们需要把这些耗时的操作,放在一个子线程中,因为子线程涉及到UI更新,Android主线程是线程不安全的,也就是说,更新UI只能在主线程中更新,子线程中操作是危险的。这个时候,Handler就出现了来解决这个复杂的问题。由于Handler运行在主线程中(UI线程中),  它与子线程可以通过Message对象来传递数据, 这个时候,Handler就承担着接收子线程传过来的(子线程用sedMessage()方法传递)Message对象,(里面包含数据)  , 把这些消息放入主线程队列中,配合主线程进行更新UI。

Handler一些特点
handler可以分发Message对象和Runnable对象到主线程中, 每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程)。
它有两个作用: (1)、安排消息或Runnable在某个主线程中某个地方执行;(2)安排一个动作在不同的线程中执行。

        Handler中分发消息的一些方法
        post(Runnable)
        postAtTime(Runnable,long)
        postDelayed(Runnable long)
        sendEmptyMessage(int)
        sendMessage(Message)
        sendMessageAtTime(Message,long)
        sendMessageDelayed(Message,long)
        以上post类方法允许你排列一个Runnable对象到主线程队列中,
        sendMessage类方法, 允许你安排一个带数据的Message对象到队列中,等待更新.

要更改UI界面内容只能在主线程里面进行,下面是一个实现在Android中,动态更改UI界面的内容:先启动一个线程timer,此线程负责对UI进行动态更改的具体操作,此外,再定义一个线程来负责主线程和timer线程的通信,此线程就是Handler!它是Runnable和Activity交互的桥梁。

步骤:

1、在MainActivity中定义操作Title具体实现

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

private int title = 0;

protected void updateTitle() {setTitle("welcome to Livingstone's blog" + title);// MainActivity中更新Title方法title++;}

2、在MainActivity中定义一个Handler,用于更新Title

private Handler changeTitleHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case 1:updateTitle();break;}}};

3、在MainActivity中定义一个TimerTask类型内部类,此Task继承自Runnable! 

private class Mytack extends TimerTask {// public abstract class TimerTask implements Runnable{}@Overridepublic void run() {Message msg = new Message();msg.what = 1;changeTitleHandler.sendMessage(msg);}}

4、在MainActivity的onCreate方法中添加一个定时器

Timer timer = new Timer();timer.scheduleAtFixedRate(new Mytack(), 1, 5000);// 方法详解 Timer.scheduleAtFixedRate(TimerTask task, long delay, long period)

* @param task | the task to schedule.
* @param delay | amount of time in milliseconds before first execution.
* @param period | amount of time in milliseconds between subsequent executions.

OK!
执行此Activity,会看到一个Title动态更新的程序。

Handler的使用场合:

1、 to schedule messages and runnables to be executed as some point in the future;

      安排messages和runnables在将来的某个时间点执行。

2、 to enqueue an action to be performed on a different thread than your own.

      将action入队以备在一个不同的线程中执行。即可以实现线程间通信。比如当你创建子线程时,你可以在你的子线程中拿到主线程中创建的Handler对象,就可以通过该对象向父线程的消息队列发送消息了。由于Android要求在UI线程中更新界面,因此,可以通过该方法在其它线程中更新界面。

1)、创建Handler对象(此处创建于主线程中便于更新UI)。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

2)、构建Runnable对象,在Runnable中更新界面。

3)、在子线程的run方法中向UI线程post,runnable对象来更新UI,Handler.post(Runnable runa)。

来源:https://www.tulaoshi.com/n/20160219/1593649.html

延伸阅读
在多线程的程序中,经常会出现两种情况: 一种情况: 应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应 这一般使用ThreadPool(线程池)来解决; 另一种情况:线程平时都处于休眠状态,只是周期性地被唤醒 这一般使用Timer(定时器)来解决; ThreadPool类提供一个由系统维护的线程池(可以看作一个线...
大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算。可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行。但是机器码是按顺序执行的,一个复杂的多步操作只能一步步按顺序逐个执行。改变这种状况可以从两个角度出发:对于单核处理器,可以将多个步骤放到不同的线程,这样一来用户完成UI...
由于一个项目的需要,我研究了一下android的网络通信方式,大体和java平台的很相似!   android平台也提供了很多的API供开发者使用,请按示例图:   首先,介绍一下通过http包工具进行通信,分get和post两种方式,两者的区别是: 1,post请求发送数据到服务器端,而且数据放在html header中一起发送到服务器url,数据对用户不可...
下面我们就动手来创建一个线程,使用Thread类创建线程时,只需提供线程入口即可。(线程入口使程序知道该让这个线程干什么事) 在C#中,线程入口是通过ThreadStart代理(delegate)来提供的,你可以把ThreadStart理解为一个函数指针,指向线程要执行的函数,当调用Thread.Start()方法后,线程就开始执行ThreadStart所代表或者说指向的函数。 ...
CancelWaitableTimer这个函数用于取消一个可以等待下去的计时器操作CallNamedPipe这个函数由一个希望通过管道通信的一个客户进程调用ConnectNamedPipe指示一台服务器等待下去,直至客户机同一个命名管道连接CreateEvent创建一个事件对象CreateMailslot创建一个邮路。返回的句柄由邮路服务器使用(收件人)CreateMutex创建一个互斥体(MUTEX)Cre...

经验教程

30

收藏

40
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部