安卓线程相关 HandlerThread Handler Thread Looper Message Runnable

本文由PurpleSword(jzj1993)原创,转载请注明

原文网址 http://blog.csdn.net/jzj1993

安卓主线程(UI线程)是线程不安全的:对UI控件的操作都应在主线程中完成;UI线程不应执行耗时操作,以免程序不响应(即ANR异常)

实现新线程的常用方法(注意要调用start方法启动新线程而不是run方法):

一、定义类,实现Runnable接口

class MyRunnable implements Runnable {

/**

* 实现接口的run方法

*/

@Override

public void run() {

// run方法的中程序体将在新线程中执行

}

}

new Thread(new MyRunnable()).start();

二、简洁写法

new Thread(new Runnable() {

@Override

public void run() {

// 新线程操作

}

}).start();

三、定义类,继承Thread(不推荐):

class MyThread extends Thread {

/**

* 覆写run方法

*/

@Override

public void run() {

// 新线程操作

}

}

new MyThread().start();

Thread和Runnable关系

public class Thread extends Object implements Runnable
{

}

创建UI线程/主线程的Handler

一、(推荐写法,用于不处理消息,只是接收Runnable的情况下)

//
无参数实例化时,会创建当前正在运行线程(即主线程)的Handler

Handler handler = new Handler();

如果handler需要处理消息,按照以下写法将会产生警告This
Handler class should be static or leaks might occur。此时可使用方法二)

Handler handler = new Handler() {

@Override

public void handleMessage(Message msg) {

switch (msg.what) {

}

}

};

二、(缺点在于需要定义一个新的类,写起来比较麻烦)

// 无参数实例化时,会创建当前正在运行线程(即主线程)的Handler

private Handler handler = new MyHandler() {

// 处理其他线程发送的消息

@Override

public void handleMessage(Message msg) {

Log.d("msg", "msg what = " + msg.what);

switch (msg.what) {

}

}

};

protected static class MyHandler extends Handler {

}

三、(推荐写法,可用于接收Runnable和处理消息的情况下)

boolean handleMessage(Message msg) {

switch (msg.what) {

}

return true;

}

private final Handler mainHandler = new Handler(Looper.getMainLooper(),

new Handler.Callback() {

@Override

public boolean handleMessage(Message msg) {

return ActivityMain.this.handleMessage(msg);

}

});

在UI线程中执行程序

handler.post(new Runnable(){

@Override

public void run() {

// 操作UI控件等...

}

});

创建新线程的Handler

private HandlerThread handlerThread;

private Handler handler;

this.handlerThread = new HandlerThread(getClass().getSimpleName());

this.handlerThread.start();

this.handler = new Handler(this.handlerThread.getLooper(),

new Handler.Callback() {

public boolean handleMessage(Message msg) {

return NewThread.this.handleMessage(msg);

}

});

/**

* 处理消息

*

@param msg

@return

*/

private boolean handleMessage(Message msg) {

switch (msg.what) {

}

return true;

}

通过Message进行线程间通信:在任意线程中向其他线程Handler发送消息

/**

* 向线程Handler发送消息

*

@param id

@param o

*/

protected void sendMsg(int id, Object o) {

if (handler != null) {

Message msg = Message.obtain();

msg.obj = o;

msg.what = id;

handler.sendMessage(msg);

}

}

/**

* 向线程Handler发送消息

*

@param what

*/

protected void sendMsg(int what) {

if (handler != null) {

handler.sendEmptyMessage(what);

}

}

handler.sendMessageDelayed(msg, milliseconds);

Message.obtain(handler, what, obj).sendToTarget();

时间: 2024-10-15 03:48:38

安卓线程相关 HandlerThread Handler Thread Looper Message Runnable的相关文章

在子线程中创建Handler和looper并与主线程进行交互

分析完上面那篇文章,基本理解了handler的实现原理,乘热打铁,这里我们利用handler原理,在子线程中创建一个handler和looper 可能很多面试时候问道,子线程中能不能new一个handler ? 答案是可以的,但是因为主线程系统默认在ActivityThread中已将帮我们创建好一个looper和MessagQueue,我们不需要手动去创建 (手动创建会出错,因为一个线程中默认只运行一个looper和MessageQueue,具体见ThreadLocal代码原理), 而子线程中没

Android 开发笔记 “线程交互(Handler+Thread 和 AsyncTask)”

为什么需要线程 假设需要开发一个联网应用程序,需要从一个网址抓取网页内容,这里读取的网页地址是笔者在本地机器上自己建立的服务器地址.当然在读取网页内容的时候,可以使用HttpClient提供的API,但是这并不是本文的介绍重点.缺乏联网程序开发经验的程序员可能写出下面的代码. package com.ophone.network; //这里为了节省篇幅,忽略了import项 public class NetworkActivity extends Activity { // 显示任务的执行状态和

android Handler Thread Looper 结合用法

在主UI线程中,系统已经初始化了一个Looper对象,因此程序直接创建Handler即可,然后公告handler来发送消息,处理消息. 程序猿自己启动的子线程,程序猿必须自己创建一个Looper对象,并且启动它,创建looper对象调用他的prepare()方法即可.该方法 保证每一个线程最多只有一个Lopper对象 调用Looper的prepare()方法为当前线程创建Looper对象,创建Looper对象的时候,他的构造器会创建一个与之配套的MessageQueue 调用Looper的loo

Android多线程分析之三:Handler,Looper的实现

Android多线程分析之三:Handler,Looper的实现 罗朝辉 (http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 在前文<Android多线程分析之二:Thread的实现>中已经具体分析了Android Thread 是怎样创建,执行以及销毁的,其重点是对对应 native 方法进行分析,今天我将聚焦于 Android Framework 层多线程相关的类:Handler, Looper, MessageQueue, Message 以及它们与

android线程通信之Handler

android中线程分为两种: 1)系统创建的用于处理UI界面和用户交互事件的主线程 2)自己创建的用于实现其他业务的子线程 UI中的控件是线程不安全的,只能在主线程中操作控件,不能在其他子线程中直接操作控件. 如果想在其他线程中操作主线程中的控件,只能通过发送一个消息告诉主线程去更新界面. 为了便于在线程间发送消息进行通信,android实现了Handler机制. 线程间通过Handler传递消息(Message).Message由一个FIFO的消息队列(MessageQueue)管理. 每个

Handler 、 Looper 、Message异步消息处理线程机制( hander消息机制原理)

Handler . Looper .Message 这三者都与Android异步消息处理线程相关的概念. 那么什么叫异步消息处理线程呢? 异步消息处理线程启动后会进入一个无限的循环体之中,每循环一次,从其内部的消息队列中取出一个消息,然后回调相应的消息处理函数,执行完成一个消息后则继续循环.若消息队列为空,线程则会阻塞等待. 详细总结::: 前提,主线程ui,只能刷新页面和处理事件:耗时的数据处理都在子线程中... 那么子线程的数据如何同步到主线程? 那就需要异步消息处理机制Handler .

Handler,Looper,Message,MessageQueue,HandlerThread使用总结(上)

在安卓程序中,经常会有一些耗时的操作例如下载,网络访问等,如果将这些放在主线程执行,会很耗时,这样可能会导致一个异常 叫ANR异常(Application Not Responding)将会阻塞UI线程,从而会导致程序无响应.因此我们会将一些耗时操作放在子线程进行,但是由于android的UI操作并不是线程安全的,因此如果多个线程同时操作UI的话,会导致线程安全问题,因此android制订了一条规则,只允许UI线程(即主线程)进行UI操作,那么我们如何知道子线程何时操作完成呢?例如子线程下载好图

Android Handler机制 (一个Thead中可以建立多个Hander,通过msg.target保证MessageQueue中的每个msg交由发送message的handler进行处理 ,但是 每个线程中最多只有一个Looper,肯定也就一个MessageQuque)

转载自http://blog.csdn.net/stonecao/article/details/6417364 在android中提供了一种异步回调机制Handler,使用它,我们可以在完成一个很长时间的任务后做出相应的通知 handler基本使用: 在主线程中,使用handler很简单,new一个Handler对象实现其handleMessage方法,在handleMessage中 提供收到消息后相应的处理方法即可,这里不对handler使用进行详细说明,在看本博文前,读者应该先掌握hand

线程间通信: Handler , Looper, MessageQueue, Message (完结)

概述:    为了 线程间 通信方便, Handler 机制 通过 Handler 和 Looper, MessageQueue, Message 这些 类 之间的协作, 简化 多线程的开发.  线程的交互 会被封装 到 Message 中, 然后 通过 Handler 的方法 把 消息 放到 MessageQueue 消息队列中, 实现 Handler 机制的线程 都会 调用 Looper 的 loop() 方法, 则 Looper 作为 消息分发者的 作用就体现出来了.  loop() 方法