一、整体工程图

二、activity_handler.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"> <Button android:text="Handler Lab1" android:id="@+id/buttonHandlerLab1" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button>
<Button android:text="Handler Lab2" android:id="@+id/buttonHandlerLab2" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button>
<Button android:text="Handler Lab3" android:id="@+id/buttonHandlerLab3" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button>
<Button android:text="Handler Lab4.1" android:id="@+id/buttonHandlerLab4_1" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button>
<Button android:text="Handler Lab4.2" android:id="@+id/buttonHandlerLab4_2" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button>
<Button android:text="Handler Lab5.1" android:id="@+id/buttonHandlerLab5_1" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button>
<Button android:text="Handler Lab5.2" android:id="@+id/buttonHandlerLab5_2" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button>
</LinearLayout>

三、HandlerActivity.java

package com.jltxgcy.handlerdemo;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast;
import android.os.Process; public class HandlerActivity extends Activity {
private static final String TAG="jltxgcy";
private final String HANDLER_KEY = "jltxgcy" ;
private Handler lab1Handler1 ;
private Handler lab1Handler2 ;
private Handler lab2Handler ;
private Handler lab3Handler;
private Handler lab4Handler;
private Handler lab5_1Handler = new Handler();
private Handler lab5_2Handler;
private Looper mLooper;
private String result;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_handler);
lab1Handler2 = new Handler(){ @Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Toast.makeText(HandlerActivity.this, "[Main Thread]Handler2 Get the message: "+msg.getData().getString(HANDLER_KEY), 5000).show() ;
} } ;
lab1Handler1 = new Handler(){ @Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
result=msg.getData().getString(HANDLER_KEY);
Toast.makeText(HandlerActivity.this, "[Main Thread]Handler1 Get the message: "+msg.getData().getString(HANDLER_KEY), 5000).show() ;
} } ; //Handler Lab1
findViewById(R.id.buttonHandlerLab1).setOnClickListener(new OnClickListener(){ @Override
public void onClick(View v) {
new Thread(new Runnable(){ @Override
public void run() { lab1Handler1.sendMessage(defineNewMessage("Lab1")) ;
//try to use mainHanlder2 to send meesage and receive .
//mainHandler2.sendMessage(defineNewMessage("Lab1")) ; } }).start(); } }) ; findViewById(R.id.buttonHandlerLab2).setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
new Thread(new Runnable(){ @Override
public void run() {
lab2Handler = new Handler(Looper.getMainLooper())
{ @Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
Log.d(TAG, "Get the message: "+msg.getData().getString(HANDLER_KEY)+" by Child Thread Handler") ;
} };
lab2Handler.sendMessage(defineNewMessage("Lab2")) ;
lab3Handler.sendMessage(defineNewMessage("Lab3")) ; } }).start() ; }
}); findViewById(R.id.buttonHandlerLab3).setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
new Thread(new Runnable(){ @Override
public void run() {
// TODO Auto-generated method stub
Looper.prepare();
lab3Handler = new Handler(){ @Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
Log.d(TAG, "Get the message from "+msg.getData().getString(HANDLER_KEY)+" by Child Thread Handler") ;
}
} ;
Looper.loop();
} }).start() ; }
}); findViewById(R.id.buttonHandlerLab4_1).setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
HandlerThread thread = new HandlerThread("ServiceStartArguments",
Process.THREAD_PRIORITY_BACKGROUND);
thread.start(); // Get the HandlerThread's Looper and use it for our Handler
mLooper = thread.getLooper();
lab4Handler = new Handler(mLooper){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
Log.d(TAG, "Start message "+msg.getData().getString(HANDLER_KEY)+" by Child Thread Handler") ;
try {
Thread.sleep(5*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.d(TAG, "Finish message "+msg.getData().getString(HANDLER_KEY)+" by Child Thread Handler");
}
};
lab4Handler.sendMessage(defineNewMessage("Lab4.1")) ;
lab4Handler.sendMessage(defineNewMessage("Lab4.2")) ; }
}); findViewById(R.id.buttonHandlerLab4_2).setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
lab4Handler.removeMessages(1); }
}); findViewById(R.id.buttonHandlerLab5_1).setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
lab5_1Handler.postDelayed(new MyRunnable(), 2000);
Log.d(TAG, ""+Thread.currentThread().getId());
}
}); findViewById(R.id.buttonHandlerLab5_2).setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
HandlerThread handlerThread = new HandlerThread("myHandlerThread");
handlerThread.start();
lab5_2Handler = new Handler(handlerThread.getLooper());
lab5_2Handler.post(new MyRunnable());
Log.d(TAG,""+Thread.currentThread().getId());
}
});
} private class MyRunnable implements Runnable {
public void run() {
Log.d(TAG, "Runnable---The Thread is running");
Log.d(TAG, ""+Thread.currentThread().getId());
}
} private Message defineNewMessage(String messageContent)
{
Message returnMsg = new Message() ;
Bundle data = new Bundle() ;
data.putString(HANDLER_KEY, messageContent) ;
returnMsg.setData(data) ;
returnMsg.what=1;
return returnMsg ;
}
}

四、解析

Handler Lab1,接受消息的Handler在主线程中定义,而且处理消息也在主线程中。发送消息在子线程中。

Handler Lab2,接受消息的Handler在子线程中定义,而处理消息却在主线程中。发送消息在子线程中。

Handler Lab3,接受消息的Handler在子线程中定义,而且处理消息也在子线程中。发送消息在主线程中。

Hander  Lab4_1,接受消息的Handler在主线程中定义,而处理消息却在子线程中。发送消息在主线程中。

Hander  Lab4_2,连续发送两条信息,结果如下,说明是一条信息结束后,才处理另一个信息。

如果在发送第一个消息没有Finish前,按下Hander  Lab4_2,那么第一个消息不会取消,第二个消息会取消。

Hander  Lab5_1,延迟2秒钟,开启run中的方法。结果显示如下,说明没有开启新的线程。

Hander  Lab5_2,结果显示如下,这回开启了新的线程。

1、Hander子线程用于每隔多长时间,或者完成一项任务向主线程发送消息,主线程接受消息后,更新UI。

2、Hander主线程负责向子线程发送消息,子线程接受消息后开始下载。

3、postDelay用于比如闹钟要隔几分钟后启动。

五、Message

获取Message的两种方式,第一种比较易读,第二种比较简洁。

          1、Message msg =new Message();
msg.arg1=x;
msg.arg2=x;
msg.obj=x;
msg.replyTo=x;
msg.what=x;
msg.setData(Bundle bundle);
2、Message msg =Handler.obtain(Handler h, int what, int arg1, int arg2, Object obj);
msg.replyTo=x;
msg.setData(Bundle bundle);

Handler总结的更多相关文章

  1. android Handler介绍

    Handler使用介绍: Handler根据接收的消息,处理UI更新.Thread线程发出消息,通知Handler更新UI. Handler mHandler = new Handler() {  p ...

  2. Handler

    1.1 继承AbstractController优点:能定制请求方式 package cn.happyl.controller; import javax.servlet.http.HttpServl ...

  3. Android消息处理机制(Handler、Looper、MessageQueue与Message)

    Android是消息驱动的,实现消息驱动有几个要素: 消息的表示:Message 消息队列:MessageQueue 消息循环,用于循环取出消息进行处理:Looper 消息处理,消息循环从消息队列中取 ...

  4. Android笔记——Handler Runnable与Thread的区别

    在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的run() ...

  5. Android消息传递之Handler消息机制

    前言: 无论是现在所做的项目还是以前的项目中,都会遇见线程之间通信.组件之间通信,目前统一采用EventBus来做处理,在总结学习EventBus之前,觉得还是需要学习总结一下最初的实现方式,也算是不 ...

  6. Handler系列之内存泄漏

    本篇简单的讲一下平常使用Handler时造成内存泄漏的问题. 什么是内存泄漏?大白话讲就是分配出去的内存,回收不回来.严重会导致内存不足OOM.下面来看一下造成内存泄漏的代码: public clas ...

  7. Handler系列之创建子线程Handler

    上一篇我介绍了Handler机制的工作原理,默认情况下,ActivityThread类为我们创建的了主线程的Looper和消息队列,所以当你创建Handler之后发送消息的时候,消息的轮训和handl ...

  8. Handler系列之原理分析

    上一节我们讲解了Handler的基本使用方法,也是平时大家用到的最多的使用方式.那么本节让我们来学习一下Handler的工作原理吧!!! 我们知道Android中我们只能在ui线程(主线程)更新ui信 ...

  9. Handler系列之使用

    作为一个Android开发者,我们肯定熟悉并使用过Handler机制.最常用的使用场景是"在子线程更新ui",实际上我们知道上面的说话是错误的.因为Android中只有主线程才能更 ...

  10. 阶段一:用Handler和Message实现计时效果及其中一些疑问

    “阶段一”是指我第一次系统地学习Android开发.这主要是对我的学习过程作个记录. 本来是打算继续做天气预报的优化的,但因为某些原因,我要先把之前做的小应用优化一下.所以今天就插播一下用Handle ...

随机推荐

  1. LINQ实现行列转换

    用SQL语句实现行列转换很容易,但也有时候需要在程序中实现,找了好久,发现一篇文章写的挺不错的 http://blog.csdn.net/smartsmile2012/article/details/ ...

  2. ffmpeg 命令详解

    常用视频命令 //转码(并添加黑边) ffmpeg -ss start_time -i input.mp4 -t total_duration -vcodec copy/h264/... -acode ...

  3. PHP学习(变量)

    PHP学习(变量) 1. PHP属于松散类型,创建变量时不用指定类型. 2.变量命名规范: 1)第一个字符必须是$ 2)$后的第一个字符必须是 字母 或 下划线 3)其他字符可以是 字母, 数字, 下 ...

  4. [LeetCode]题解(python):131-Palindrome Partitioning

    题目来源: https://leetcode.com/problems/palindrome-partitioning/ 题意分析: 给定一个字符串s,将s拆成若干个子字符串,使得所有的子字符串都是回 ...

  5. IOS UIActionSheet的使用方法

    在IOS的用户接口向导中,苹果提供了另外一种显示警告框的手法,叫做UIActionSheet.它和UIAlertView比起来不会显得过于急切和紧张.而是很温和地在继续流程之前给用户提供了诸多选择. ...

  6. C++ enum 作用域问题和解决方案

    C++ 中的枚举类型继承于 C 语言.就像其他从 C 语言继承过来的很多特性一样,C++ 枚举也有缺点,这其中最显著的莫过于作用域问题--在枚举类型中定义的常量,属于定义枚举的作用域,而不属于这个枚举 ...

  7. 《刺杀金正恩》1080p全高清无水印,附中文字幕 bt种子下载,附字母(百度网盘/360云盘)

    <刺杀金正恩>1080p全高清无水印,附中文字幕下载(百度网盘/360云盘) 种子和字幕下载地址: thunder://QUFlZDJrOi8vfGZpbGV8JUU5JTg3JTg3JU ...

  8. spring学习总结(mybatis,事务,测试JUnit4,日志log4j&slf4j,定时任务quartz&spring-task,jetty,Restful-jersey等)

    在实战中学习,模仿博客园的部分功能.包括用户的注册,登陆:发表新随笔,阅读随笔:发表评论,以及定时任务等.Entity层设计3张表,分别为user表(用户),essay表(随笔)以及comment表( ...

  9. 【Untiy3D 游戏开发之一】Unity3D For Window/Mac最新4.2.0版本破解教程

    转载请标明:转载自[小枫栏目],博文链接:http://blog.csdn.net/rexuefengye/article/details/11646885 一.Unity3D For Mac 1.首 ...

  10. 进一步探索:Windows Azure 网站中解锁的配置选项

     编辑人员注释: 本文章由 Windows Azure 网站团队的项目经理 Erez Benari 撰写. 在 Windows Azure 网站 (WAWS) 中管理网站时,许多选项可使用 Azu ...