Android架构分析之Android消息处理机制(一)
作者:刘昊昱
博客:http://blog.csdn.net/liuhaoyutz
Android版本号:4.4.2
在这个系列文章中我们将来分析Android消息处理机制。
本文介绍了一个使用Handler的Android应用程序,通过该程序,我们能够了解Handler的基本使用方法。进而在后面的文章中,我们会扩展到Looper、Message、MessageQueue、Runnable等Android对象,对它们的实现进行具体分析,这些对象组成了Android消息处理系统。
在Android应用程序中,假设要运行一个用时比較长的操作。比如訪问网络,为了避免出现No Response错误。我们要将该操作放在一个单独的线程中运行。
可是假设该操作完毕后。须要改动UI界面,则会出现故障。由于除了UI线程,其他线程不能改动UI界面,这样的情况下,能够使用handler。以下我们来看一个样例,程序运行效果例如以下:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl1aGFveXV0eg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" width="508" height="373" alt="">
点击Button1button后,该程序执行一个用时比較长的操作(我们用sleep10秒钟来模拟该操作),然后在主界面上显示“Button1 is clicked!”。执行效果例如以下:
点击Button2button后,该程序执行一个用时比較长的操作(我们用sleep10秒钟来模拟该操作),然后在主界面上显示“Button2 is clicked!”,执行效果例如以下:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl1aGFveXV0eg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" width="508" height="373" alt="">
以下我们来看这个程序代码。
主程序TestHandlerActivity.java内容例如以下:
package com.haoyu.testHandler; import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView; public class TestHandlerActivity extends Activity implements OnClickListener{
TextView textView; /** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button1 = (Button) findViewById(R.id.button1);
Button button2 = (Button) findViewById(R.id.button2);
textView = (TextView) findViewById(R.id.textView); button1.setOnClickListener(this);
button2.setOnClickListener(this);
} public Handler handler =new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
if(msg.what == 1)
textView.setText("Button1 is clicked!");
else if(msg.what == 2)
textView.setText("Button2 is clicked!");
else
textView.setText("Unknown message!");
}
}; @Override
public void onClick(View v) {
// TODO Auto-generated method stub
int id = v.getId(); if(id == R.id.button1)
{
new Thread(new BackgroundTask(handler, 1)).start();
}
if(id == R.id.button2)
{
new Thread(new BackgroundTask(handler, 2)).start();
}
}
}
BackgroundTask.java文件内容例如以下:
package com.haoyu.testHandler; import android.os.Handler;
import android.os.Message; public class BackgroundTask implements Runnable {
Handler mHandler;
int mFlag; BackgroundTask(Handler handler, int flag) {
mHandler = handler;
mFlag = flag;
} @Override
public void run() {
Message message = new Message();
// TODO Auto-generated method stub
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
message.what = mFlag;
mHandler.sendMessage(message);
} }
主布局文件main.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" >" <TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingTop="60dp"
android:textSize="20dp"
android:gravity="center"
android:id="@+id/textView"
android:text="@string/prompt"
/> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:orientation="horizontal" >
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/Button1"
android:id="@+id/button1" /> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/Button2"
android:id="@+id/button2" />
</LinearLayout> </LinearLayout>
Android架构分析之Android消息处理机制(一)的更多相关文章
- Android架构分析之Android消息处理机制(二)
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Android版本号:4.4.2 在上一篇文章中我们看了一个使用Handler处理Message消息的样例,本文我们 ...
- Android架构分析之使用自定义硬件抽象层(HAL)模块
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Android版本:2.3.7_r1 Linux内核版本:android-goldfish-2.6.29 在上一篇博 ...
- Android架构分析之LOG模块
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Android版本:2.3.7_r1 Linux内核版本:android-goldfish-2.6.29 Andro ...
- Android 核心分析 之八Android 启动过程详解
Android 启动过程详解 Android从Linux系统启动有4个步骤: (1) init进程启动 (2) Native服务启动 (3) System Server,Android服务启动 (4) ...
- Android线程与异步消息处理机制
在程序开发时,对于一些比较耗时的操作,我们通常会为其开辟一个单独的线程来执行,这样可以尽可能的减少用户等待的时间.在Android中,默认情况下,所有的操作都是在主线程中进行的,这个主线程负责管理与U ...
- Android 流量分析 tcpdump & wireshark
APP竞争已经白热化了,控制好自己Android应用的流量能够给用户一个良好的用户体验噢,给用户多一个不卸载的理由. Android 怎样进行流量分析?用好tcpdump & wireshar ...
- 【转载】Android异步消息处理机制详解及源码分析
PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbob ...
- 转 Android的消息处理机制(图+源码分析)——Looper,Handler,Message
作为一个大三的预备程序员,我学习android的一大乐趣是可以通过源码学习google大牛们的设计思想.android源码中包含了大量的设计模式,除此以外,android sdk还精心为我们设计了各种 ...
- 【转】android的消息处理机制(图+源码分析)——Looper,Handler,Message
原文地址:http://www.cnblogs.com/codingmyworld/archive/2011/09/12/2174255.html#!comments 作为一个大三的预备程序员,我学习 ...
随机推荐
- 【反演复习计划】【bzoj4407】于神之怒加强版
#include<bits/stdc++.h> #define N 5000010 #define yql 1000000007 using namespace std; typedef ...
- OpenCV-2.4.6-android-sdk 人脸识别demo搭建
最近项目需要研究下人脸识别,在领导推荐下准备研究OpenCV 一,上官网了解下 基本知识 http://docs.opencv.org/doc/tutorials/introduction/andro ...
- css用法(持续更新ing)
*:选择所有节点 #container:选取id为container的节点 .container:选取所有class包含container的节点 li a:选取li下的所有a节点 ul +p:选取ul ...
- [ Openstack ] Openstack-Mitaka 高可用之 计算服务(Nova)
目录 Openstack-Mitaka 高可用之 概述 Openstack-Mitaka 高可用之 环境初始化 Openstack-Mitaka 高可用之 Mariadb-Galera集群 ...
- [ Centos 7 iscsi搭建 及 1台客户端同时挂载多台iscsi服务端问题 ]
一.什么是iscsi iSCSI技术是一种由IBM公司研究开发的,是一个供硬件设备使用的可以在IP协议的上层运行的SCSI指令集,这种指令集合可以实现在IP网络上运行SCSI协议,使其能够在诸如高速千 ...
- webupload在IE9-出现的问题解决
1,点击选择按钮无反应 原因:IE9调用的是flash上传,Upload.swf路径错误!!导致 解决:检查Upload.swf路径是否准确!!!!直接改成cdn地址,是最直接有效的办法. 2,IE9 ...
- vue学习记录:vue引入,validator验证,数据信息,vuex数据共享
最近在学习vue,关于学习过程中所遇到的问题进行记录,包含vue引入,validator验证,数据信息,vuex数据共享,传值问题记录 1.vue 引入vue vue的大致形式如下: <temp ...
- 从事前端开发必须要了解的CSS原理
从事Web前端开发的人都与CSS打交道很多,有的人也许不知道CSS是怎么去工作的,写出来的CSS浏览器是怎么样去解析的呢?当这个成为我们提高CSS水平的一个瓶颈时,是否应该多了解一下呢? 一.浏览器的 ...
- 大数据量的Mysql数据库备份策略
Centos下mysql常用的三种备份方法 http://www.centoscn.com/CentOS/Intermediate/2013/0807/1160.html xtrabackup备份 h ...
- zsh命令行
Linux/Unix提供了很多种Shell,为毛要这么多Shell?难道用来炒着吃么?那我问你,你同类型的衣服怎么有那么多件?花色,质地还不一样.写程序比买衣服复杂多了,而且程序员往往负责把复杂的事情 ...