Handler概述
Android启动后会建立一个主线程(UI线程),主线程主管UI控件和事件的分发。如果一个比较耗时的操作在主线程中处理会造成UI阻塞,此时我们
应将耗时或消耗资源的操作放在子线程中进行。子线程通常要操作UI,而UI线程是不安全的只能在主线程中进行,所以子线程应将Message传
递到主线程中,在主线程中完成UI更新。Handler的线程间通信功能理想的选择。
Handler只能接受自身实例所发送的Message。
Handler的作用
执行计划任务。例如模拟定时器
线程间通信。当Android程序启动时会创建一个主线程(UI线程),主线程会默认建立消息队列来处理各种消息(子线程不会默认),当在子线程中得
到主线程的Handler实例时,就可以call Handler的sendMessage()方法向主线程发送消息,完成子线程向主线程的单向通信。Handler的本质
是解决线程间通信问题,所以通过Handler以及Handler管理下的Looper、Message、MessageQueue对象方法可实现线程间消息的互传递。
分发Message对象或者Runable对象到其他线程
安排一个动作道不同的线程执行
Handler的实现原理
//Handler
//实现了Handler.Callback接口,重写了handlerMessage()方法。
new Handler(); new Handler(Looper looper);
boolean post(Runable r);将r线程中的消息发送到目标消息队列中
boolean sendMessage(Message msg);
Message obainMessage();
Message obainMessage(int what);
Looper getLooper();
String getMessageName(Message msg);
//Message 消息体含有发送者Handler的what标记,所以handler只能接收自己所发送的消息
new Message();
void setData(Bundle bundle);
Bundle getData();
static Message obain();
static Message obain(Handler h);
//Bundle
new Bundle();
void putType("key",Type value);
Type getType("key");
//MessageQueue 由系统实现,用以维护消息的机制,开发人员是不用考虑MessageQueue的。
//Looper
static void prepare();//为当前线程初始化一个Looper
static void loop();//启动Looper
static Looper getMainLooper() ;//获取主线程Looper
void quit();
static Looper myLooper();获得当前线程相关的Looper
Thread getThread();获得与Looper相关的线程
//HandlerThread
// 继承自Thread,为开启的线程创建默认的MessageQueue,是拥有Looper特性的线程,
new HandlerThread(Stirng name); new HandlerThread(String name,int priority);//priority线程优先权
Looper getLooper();
void onLooperPrepared();
Handler与线程间的关系
Handler是多线程的应用吗?
是的
Handler消息队列的实现
Handler是异步的,它会建立线程吗?
Handler是由vm控制的系统底层的实现,或许是由底层线程维护,但并没有在我们的应用层建立新的线程
Handler是在主线程内吗?
不一定,看你创建Handler的位置。
Handler的post(Runable thread)和sendMessage(Message msg)方法使用的是一个队列吗?
是的。post() Method 其实质是调用传入的线程的消息发送Method。
在子线程中建立一个Handler,然后call sendMessage()方法会怎样?
子线程默认是没有消息队列的,在子线程中实例化Handler并call sendMessage()方法会throw exception,所以在子线程中要实例化Looper,
并call loop方法来启动looper监听消息。
在子线程中建立Handler,构造时传入主线程的Looper可以吗?
可以。
Handler的应用:handler的应用应抓一个解释两点本质
解释:当某线程中的Looper监听到某线程的Handler发送的Message时,就会触发该Handler的handleMessage()
method.
本质:1、获取某一线程Handler对象 2、获取某一线程Looper对象并启动Looper
子线程中获取主线程中创建的Handler,并操作主线程MessageQueue,向主线程发送消息。主线程中创建的Handler默认绑定到主线程中的Looper。
//创建Handler子类
class MyThreadHandler extends Handler
{
public void handleMessage(Message msg)
{
super.handleMessage(Message msg);
//your code here;
}
}
//消息体生成方法
provite Message defineMessage(String msgString)
{
Message msg=new Message();
Bundle bundle=new Bundle();
bundle.putString("MSG",msgString);
msg.setData(bundle);
return msg;
}
}
//创建Activity
public class MyActivity extends Activity
{
Button button=null;
MyThreadHandler handler=null;
protected void onCreate(Bundle saveInstanceState)
{
super.onCreate(savaInstanceState);
setContentView(R.layout.myLayout);
handler=new MyThreadHandler();
button1=(Button)findViewById(R.id.button);
button1.setOnClickListener(new OnClickListener(
public void onClick(View v)
{
//新建线程,发送消息
new Thread(new Runable(){
public void run()
{
handler.sendMessage(defineMessage("我的消息"));
}
}).start();
}
));
}
在子线程中创建Handler,并通过Looper.getMainLooper()传入主线程的Looper,向主线程的Looper发送Message。
//创建Handler子类
class MyThreadHandler extends Handler
{
public void handleMessage(Message msg)
{
super.handleMessage(Message msg);
//your code here;
}
}
//消息体生成方法
provite Message defineMessage(String msgString)
{
Message msg=new Message();
Bundle bundle=new Bundle();
bundle.putString("MSG",msgString);
msg.setData(bundle);
return msg;
}
}
//创建Activity
public class MyActivity extends Activity
{
Button button=null;
protected void onCreate(Bundle saveInstanceState)
{
super.onCreate(savaInstanceState);
setContentView(R.layout.myLayout);
button=(Button)findViewById(R.id.button);
button.setOnClickListener(new OnClickListener(
public void onClick(View v)
{
//新建线程,发送消息
new Thread(new Runable(){
//在子线程中创建Handler
public void run()
{
ThreadHandler handler=new MyThreadHandler(Looper.getMainLooper());
handler.sendMessage(defineMessage("我的消息"));
}
}).start();
}
));
}
通过HandlerThread创建带有默认Looper的子线程
//创建Handler子类
class MyThreadHandler extends Handler
{
public void handleMessage(Message msg)
{
super.handleMessage(Message msg);
//your code here;
}
}
//消息体生成方法
provite Message defineMessage(String msgString)
{
Message msg=new Message();
Bundle bundle=new Bundle();
bundle.putString("MSG",msgString);
msg.setData(bundle);
return msg;
}
}
//创建HandlerThread子类
public MyHandlerThread extends HandlerThread()
{
public MyHandlerThread(String name)
{super.(name);}
public void run()
{
Looper looper=this.getLooper();
MyHandler handler=new MyHandler(looper);
handler.sendMessage("MSG","我的消息");
}
}
//创建Activity
public class MyActivity extends Activity
{
Button button=null;
protected void onCreate(Bundle saveInstanceState)
{
super.onCreate(savaInstanceState);
setContentView(R.layout.myLayout);
button=(Button)findViewById(R.id.button);
button.setOnClickListener(new OnClickListener(
public void onClick(View v)
{
//新建线程,发送消息
new MyHandlerThread(String myHandlerThread).start();
}
));
}
在子线程中创建Handler和Looper,发送消息自接收
//创建Handler子类
class MyThreadHandler extends Handler
{
public void handleMessage(Message msg)
{
super.handleMessage(Message msg);
//your code here;
}
}
//消息体生成方法
provite Message defineMessage(String msgString)
{
Message msg=new Message();
Bundle bundle=new Bundle();
bundle.putString("MSG",msgString);
msg.setData(bundle);
return msg;
}
}
//创建Activity
public class MyActivity extends Activity
{
Button button=null;
protected void onCreate(Bundle saveInstanceState)
{
super.onCreate(savaInstanceState);
setContentView(R.layout.myLayout);
button=(Button)findViewById(R.id.button);
button.setOnClickListener(new OnClickListener(
public void onClick(View v)
{
//新建线程,发送消息
new Thread(new Runable(){
//在子线程中创建Handler
public void run()
{
Looper.prepare();//为当前线程初始化Looper
ThreadHandler handler=new MyThreadHandler();
handler.sendMessage(defineMessage("我的消息"));
Looper.loop();//启动Looper监听方法
}
}).start();
}
));
}
分享到:
相关推荐
【Android Handler机制】是Android应用程序中用于线程间通信的核心组件,它与Looper和Message紧密配合,实现消息的发送、处理以及线程间的同步。在Android应用开发中,尤其是涉及到UI更新时,Handler机制显得尤为...
在Android开发中,`Handler`、`Message`和`Looper`是实现线程间通信的重要机制,特别是当需要在主线程(UI线程)和工作线程之间传递数据时。本示例“Android Handler传值的demo”将帮助我们深入理解这一机制。 `...
在“androidHandler测试的demo”中,我们可以预期包含以下内容: 1. 创建自定义`Handler`子类:这个子类可能重写了`handleMessage(Message msg)`方法,根据`msg.what`的值执行不同的操作,比如更新UI元素或执行特定...
在Android开发中,Handler、Looper和Message是实现线程间通信的重要组件,它们共同构建了Android的消息处理机制。本文将详细分析Android Handler消息处理的顺序,以及如何利用这些组件进行异步操作。 首先,理解...
【标题】"老罗android Handler综合练习 图文混排 服务器端源代码"涉及的是Android应用开发中的关键知识点,主要集中在Handler机制、图文混排以及服务器端的数据交互。Handler是Android系统中用于线程间通信的重要...
由于Android的单线程模型,直接在后台线程更新UI是不允许的,这时就需要用到Handler、Looper和Message机制来实现跨线程通信,特别是用于模拟进度条更新,让用户体验更加友好。本篇文章将深入探讨如何使用Android ...
在Android开发中,`Handler`是一个至关重要的组件,它用于处理与线程通信相关的任务,尤其是在主线程(UI线程)和工作线程之间。`Handler`、`Looper`和`Message`三者共同构成了Android的消息传递机制。下面将详细...
# Android Handler解析 在Android应用开发中,保持应用程序的响应性是至关重要的。为了实现这一目标,我们需要确保UI线程不会被阻塞。通常来说,将耗时的任务(如网络请求、复杂计算等)放到后台线程执行可以提高UI...
在Android开发中,`Handler`、`Looper`和`Message`是实现线程间通信的重要组件,特别是用于主线程(UI线程)与其他工作线程之间的交互。标题“android handler的一些测试”暗示我们将探讨`Handler`如何在多线程环境...
Android Handler类详解 Android Handler类详解 Android Handler类详解 Android Handler类详解
### Android Handler运行原理详解 #### 一、引言 在Android开发中,线程间通信是非常重要的技术之一,其中Handler机制被广泛应用于实现主线程与子线程之间的数据交互。Handler机制不仅简单易用,而且功能强大,是...
Android Handler机制的工作原理详析 Android Handler机制是Android系统中的一种消息机制,负责处理应用程序中的消息处理和线程之间的通信。Handler机制的工作原理可以分为以下几个部分:Looper、MessageQueue、...
Handler是Android中的一个类,它用于在不同的线程之间发送和处理消息。通常,我们使用Handler配合Looper和Message来实现在主线程(UI线程)中执行后台任务的结果。Looper是消息队列的循环器,它不断检查消息队列并...
在Android开发中,`Handler` 是一个至关重要的组件,它涉及到多线程、UI更新以及消息传递机制。本文将深入探讨 `Handler` 的工作原理,分析其如何在不同线程间进行通信,并通过实例代码来展示其具体用法。 ### ...
在Android系统中,Handler、Looper和Message构成了一个用于线程间通信的重要机制。这个机制使得UI线程可以处理来自其他线程的消息,从而避免了直接在非UI线程操作UI组件,防止应用出现ANR(Application Not ...
在Android开发中,Handler是一种非常重要的组件,它与线程通信密切相关,特别是在更新UI和处理异步任务时。本文将深入探讨如何利用Handler构建一个图片浏览器,并结合计时器(Timer)来实现特定功能。 首先,理解...
Android Handler机制解析 Android Handler机制是Android系统中的一种机制,用于处理线程之间的通信和消息传递。在Android系统中,Handler机制是基于Java的线程机制来实现的。下面将对Android Handler机制进行详细的...
在Android应用开发中,Handler是实现线程间通信的关键组件,尤其在涉及到UI更新时,它的作用尤为重要。本文将深入探讨“Android Handler定时更新UI”的相关知识点,以及如何使用CounterDemo来实现这一功能。 首先,...
【Android Handler 使用详解】 Handler 是 Android 平台中用于处理线程间通信的关键组件,尤其在涉及 UI(用户界面)更新时,它扮演着至关重要的角色。在 Android 应用程序启动时,系统会默认创建一个主线程,也...
在Android开发中,`Handler`、`Thread`、`Toast`、`消息队列`以及`线程`是实现UI交互和异步处理的关键概念。本文将深入探讨这些概念,并结合给定的"Android Handler 线程 示例代码"进行详细讲解。 首先,我们来看`...