作者:刘昊昱

博客: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消息处理机制(一)的更多相关文章

  1. Android架构分析之Android消息处理机制(二)

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Android版本号:4.4.2 在上一篇文章中我们看了一个使用Handler处理Message消息的样例,本文我们 ...

  2. Android架构分析之使用自定义硬件抽象层(HAL)模块

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Android版本:2.3.7_r1 Linux内核版本:android-goldfish-2.6.29 在上一篇博 ...

  3. Android架构分析之LOG模块

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Android版本:2.3.7_r1 Linux内核版本:android-goldfish-2.6.29 Andro ...

  4. Android 核心分析 之八Android 启动过程详解

    Android 启动过程详解 Android从Linux系统启动有4个步骤: (1) init进程启动 (2) Native服务启动 (3) System Server,Android服务启动 (4) ...

  5. Android线程与异步消息处理机制

    在程序开发时,对于一些比较耗时的操作,我们通常会为其开辟一个单独的线程来执行,这样可以尽可能的减少用户等待的时间.在Android中,默认情况下,所有的操作都是在主线程中进行的,这个主线程负责管理与U ...

  6. Android 流量分析 tcpdump &amp; wireshark

    APP竞争已经白热化了,控制好自己Android应用的流量能够给用户一个良好的用户体验噢,给用户多一个不卸载的理由. Android 怎样进行流量分析?用好tcpdump & wireshar ...

  7. 【转载】Android异步消息处理机制详解及源码分析

    PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbob ...

  8. 转 Android的消息处理机制(图+源码分析)——Looper,Handler,Message

    作为一个大三的预备程序员,我学习android的一大乐趣是可以通过源码学习google大牛们的设计思想.android源码中包含了大量的设计模式,除此以外,android sdk还精心为我们设计了各种 ...

  9. 【转】android的消息处理机制(图+源码分析)——Looper,Handler,Message

    原文地址:http://www.cnblogs.com/codingmyworld/archive/2011/09/12/2174255.html#!comments 作为一个大三的预备程序员,我学习 ...

随机推荐

  1. 算法题之Leetcode分糖果

    题目: There are N children standing in a line. Each child is assigned a rating value. You are giving c ...

  2. 关于MYSQL表记录字段换行符回车符处理

    http://hualong.iteye.com/blog/1933023 今天遇到一个非常奇葩的问题,数据库表中明明有值却查询不不出来,而然一次从单元格中复制到sql中,发现右侧单引号换行了,我初步 ...

  3. jQuery 立即执行

    ;(function($){// 可以去掉开头的 ; (分号),国外的开发人员编写的插件时的一种习惯 $.fn.pluginName = function() { // Our plugin impl ...

  4. python提纲

    根据网上专栏整理提纲 1.模块介绍 2.time&datetime模块 3.random模块 4.os模块 5.sys模块 6.json&pickle模块 7.logging模块 8. ...

  5. Wannafly挑战赛17 A 走格子【矩阵行走/模拟】

    [链接]:A [分析]:可以设置方向数组和标记数组.当不合法(越界/访问过)就转向,转向可以用now=(now+1)%4 [代码]: #include <bits/stdc++.h> #d ...

  6. Xamarin XAML语言教程基本视图ContentView

    Xamarin XAML语言教程基本视图ContentView 基本视图ContentView 视图是用来呈现具体内容,根据呈现内容不同,使用的视图也不同.其中,最常用的视图为ContentView视 ...

  7. Scrum生命周期

    Recently while cleaning up my photo albums I found some interesting old pictures which were captured ...

  8. [Codeforces 30D] Kings Problem

    Brief Intro: 有n+1个点,其中n个点在X轴上,求从第k个点出发最短的汉密尔顿路径 Solution: 分类讨论+逐个枚举 设dist(i)是第i个点到n+1的距离 cal1(l,r)是n ...

  9. [SPOJ]DIVCNT3

    别人写的讲得挺好的博客 洲阁筛,一种快速求积性函数前缀和的算法 求$\sum\limits_{i=1}^nF(i)$,其中$F(x)$是积性函数,并且$F(p^c)$是关于$p$的低阶多项式 我们把$ ...

  10. 【找规律】Divide by Zero 2017 and Codeforces Round #399 (Div. 1 + Div. 2, combined) B. Code For 1

    观察一下,将整个过程写出来,会发现形成一棵满二叉树,每一层要么全是0,要么全是1. 输出的顺序是其中序遍历. 每一层的序号形成等差数列,就计算一下就可以出来每一层覆盖到的区间的左右端点. 复杂度O(l ...