- 浏览: 273074 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
tonytony3:
THANK YOU
Android多级树形菜单的实现 -
haiyang08101:
deleteNumber = "421f481e-7 ...
java对xml文件做增删改查 -
求求你帮帮我:
怎么把我的空格也当成节点处理了?
java对xml文件做增删改查 -
求求你帮帮我:
deleteNumber = "421f481e-7 ...
java对xml文件做增删改查 -
lpj13579:
多谢分享,学习学习
高仿小米盒子UI效果实现
Handler类的主要作用有两个:
- 在新启动的线程中发送消息
- 在主线程中获取、处理消息
上面的说法很简单,似乎只要分成两步即可:在新启动的线程中发送消息:然后在主线程中获取、并处理消息。 但这个过程涉及一个问题:新启动的线程何时发送消息呢?
主线程何时去获取并处理消息呢?这个时机显然不好控制。 (Handler是异步消息机制)
为了让主线程能“适时”地处理新启动的线程所发送的信息,显然只能通过回调的方式来实现-----开发者只要重新Handler类中处理消息的方法,当新启动的线程发消息时,Handler类中处理消息的方法被自动回调。
Handler类包含如下方法用于发送、处理消息。
- void handleMessage(Message msg): 处理消息的方法。该方法通常用于被重写
- final boolean hasMessages(int what): 检查消息队列中是否包含what属性为指定值的消息。
- final boolean hasMessages(int what, Object object):检查消息队列中是否包含what属性为指定值且Object属性为指定对象的消息。
- 多个重载的Messge obtainMessage(): 获取消息。
- sendEmptyMessage(int what): 发送空消息。
- final boolean sendEmptyMessageDelayed(int what, long delayMillis):指定多少毫秒之后发送空消息
- final boolean sendMessage(Message msg): 立即发送消息。
- final boolean sendMessageDelayed(Message msg, long delayMillis): 指定多少毫秒之后发送消息
借助上面这些方法,程序可以方便利用Handler来进行消息传递。
关键词
Android.os.Handler涉及较多的知识点,我把一些关键词列举在下面,将主要介绍Handler:
android.os.Handler
Handler在android里负责发送和处理消息。它的主要用途有:
1)按计划发送消息或执行某个Runnanble(使用POST方法);
2)从其他线程中发送来的消息放入消息队列中,避免线程冲突(常见于更新UI线程)
默认情况下,Handler接受的是当前线程下的消息循环实例(使用Handler(Looper looper)、Handler(Looper looper, Handler.Callback callback)可以指定线程),同时一个消息队列可以被当前线程中的多个对象进行分发、处理(在UI线程中,系统已经有一个Activity来处理了,你可以再起若干个Handler来处理)。在实例化Handler的时候,Looper可以是任意线程的,只要有Handler的指针,任何线程也都可以sendMessage。Handler对于Message的处理不是并发的。一个Looper 只有处理完一条Message才会读取下一条,所以消息的处理是阻塞形式的(handleMessage()方法里不应该有耗时操作,可以将耗时操作放在其他线程执行,操作完后发送Message(通过sendMessges方法),然后由handleMessage()更新UI)。
<?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:id="@+id/startButton" android:layout_width = "fill_parent" android:layout_height="wrap_content" android:text="start" /> <Button android:id="@+id/endButton" android:layout_width = "fill_parent" android:layout_height= "wrap_content" android:text="end" /> </LinearLayout>
public class HandlerTestActivity extends Activity { //声明两个按钮控件 private Button startButton = null; private Button endButton = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //根据控件的ID得到代表控件的对象,并为这两个按钮设置相应的监听器 startButton = (Button)findViewById(R.id.startButton); startButton.setOnClickListener(new StartButtonListener()); endButton = (Button)findViewById(R.id.endButton); endButton.setOnClickListener(new EndButtonListener()); } class StartButtonListener implements OnClickListener{ public void onClick(View v){ //调用Handler的post方法,将要执行的线程对象添加到队列当中 handler.post(updateThread); } } class EndButtonListener implements OnClickListener{ public void onClick(View v){ handler.removeCallbacks(updateThread); } } //创建一个Handler对象 Handler handler = new Handler(); //将执行的操作写在线程对象的run方法当中 Runnable updateThread = new Runnable(){ public void run(){ System.out.println("UpdateThread"); //在run方法内部,执行postDelayed或者是post方法 handler.postDelayed(updateThread, 3000); //隔了3000毫秒再加入到队列中去, postDelayed 加入到消息队列中去 } }; }
发表评论
-
Android 三大图片加载框架比较
2016-11-30 10:31 10901.哪三大图片加载框架? 1) Pi ... -
仿微信小视屏拍摄的进度条/自定义的progressBar的样式。
2016-08-20 00:25 1029今天有个需求,就是需要倒计时的进度条,样式参考微信小视屏拍摄 ... -
android 闹钟定时任务 AlarmManager
2016-06-02 13:41 1830直接上代码 package com.exampl ... -
android应用实现重启系统
2016-06-02 13:33 35281.在AndroidManifest.xml文件的manif ... -
android 每天定时提醒功能实现
2016-06-01 22:42 0android要实现定时的功 ... -
Java Calendar 类的时间操作
2016-06-01 21:02 671ava Calendar 类时间操作,这也许是创建日历和管理 ... -
android中fragment和activity之间相互通信
2014-11-13 16:25 1443在用到fragment的时候,老是会遇到一个问题,就是fra ... -
墨迹天气上下滑动viewpager
2014-11-04 17:15 765墨迹天气上下滑动viewpager -
Android杂谈--打开文件的Intent及使用
2014-10-25 13:03 648在写文件管理系统时会用到各种打开不同格式的文件的需求,由于A ... -
获取Android签名证书的sha1值
2014-08-23 23:14 666前言:今天开始研 ... -
java中Keytool的使用总结
2014-08-23 22:40 562J2SDK提供了keytool命令行工具,可以根据指定的参数 ... -
android获取versionName和versionCode
2014-07-08 18:02 739<TextView android:textSize= ... -
Android如何防止apk程序被反编译
2014-07-08 17:22 709作为Android应用开发者,不得不面对一个尴尬的局面,就是 ... -
在GridView中实现单选或多选功能
2014-06-26 13:08 846由于项目需要,要用到GridView实现多选功能,在网上搜 ... -
Android中Tween动画和Frame动画实例
2014-06-26 10:46 727Animation主要有两种动画模式:Tween动画和Fra ... -
android 禁用和开启四大组件的方法(setComponentEnabledSetting )
2014-06-19 15:26 0为什么要关闭组件? 在用到组件时,有时候我们可能暂时性的不使 ... -
android MD5校验码的生成与算法实现
2014-06-17 10:58 889在Java中,java.security.Mes ... -
android 自动检测版本升级
2014-06-15 14:10 387这里我用别的app代替了,简单省事,正常的话,你要对你的 ... -
layout左右平滑控制.
2014-04-30 09:41 617<?xml version="1.0&quo ... -
android让你的TabHost滑动起来
2014-04-22 22:13 821在Android应用中,一般TabActivity和若干个T ...
相关推荐
1. **创建Handler实例**:在主线程中创建一个`Handler`实例,重写`handleMessage(Message msg)`方法。在这个方法中,我们将处理与图片显示相关逻辑,例如更新ImageView的图片资源。 ```java class MainActivity ...
注意,如果Handler实例与Activity绑定,且Handler在消息队列中有未处理的消息,那么Activity可能无法正常销毁,导致内存泄漏。为避免这个问题,可以使用WeakReference持有Handler,确保当Activity被回收时,Handler...
在Android开发中,`Handler`、`Looper`和`Message`是实现线程间通信的重要机制,特别是用于主线程和工作线程之间的交互。本文将深入解析`Handler`的使用,以及结合`Thread`实现异步操作的具体示例。 首先,`Handler...
通常,我们会在主线程(UI线程)中创建一个Handler实例,这样处理的消息就会在这个线程中执行,这对于更新UI是必要的,因为Android只允许主线程操作UI。 `Runnable`是一个接口,它定义了一个单个方法`run()`. 任何...
在“androidHandler测试的demo”中,我们可以预期包含以下内容: 1. 创建自定义`Handler`子类:这个子类可能重写了`handleMessage(Message msg)`方法,根据`msg.what`的值执行不同的操作,比如更新UI元素或执行特定...
在Android开发中,`Handler`、`Message`和`Looper`是实现线程间通信的重要机制,特别是当需要在主线程(UI线程)和工作线程之间传递数据时。本示例“Android Handler传值的demo”将帮助我们深入理解这一机制。 `...
1. 创建Handler实例:在创建Handler时,通常会重写`handleMessage(Message msg)`方法,定义当Message被处理时执行的操作。 2. 发送消息:通过`sendMessage()`或`post(Runnable r)`等方法向消息队列中添加Message或...
1. **创建Handler**:在主线程中创建Handler实例,或者在其他线程中通过Looper.prepare()和Looper.loop()创建一个独立的消息循环。 2. **发送消息**:使用Handler的`sendMessage()`或`postDelayed()`方法发送一个...
1. **创建Handler实例**:在Activity或Fragment的onCreate()方法中创建Handler实例,确保它在主线程中,这样处理的消息才能更新UI。 ```java private Handler mHandler = new Handler() { @Override public void ...
1. 创建一个Handler实例,用于发送和处理消息。 2. 创建一个Runnable接口的实现,定义需要在子线程执行的任务。 3. 将Runnable对象提交到消息队列中,Handler会自动将这些任务移交给线程池执行。 4. 如果需要更新UI...
【Android Handler 使用详解】 Handler 是 Android 平台中用于处理线程间通信的关键组件,尤其在涉及 UI(用户界面)更新时,它扮演着至关重要的角色。在 Android 应用程序启动时,系统会默认创建一个主线程,也...
- **创建Handler对象**:首先在需要处理消息的线程(通常是主线程)中创建一个Handler实例,重写handleMessage()方法,这个方法会在接收到消息后被调用,用于执行相应的操作。 ```java class MyActivity extends ...
Android中Handler的学习实例,在本示例中,在主线程外开启子线程(使用匿名内部类Runnable),使用Handler中的Message传递消息(高效),操作一个ProgressBar的进度。适合初学者学习和了解Handler以及ProgressBar的...
通过创建Handler实例,开发者可以在其他线程中通过post()或sendMessage()方法发送Message或Runnable到Handler所在的线程,并由该Handler进行处理。Handler通常用于执行需要在UI线程上运行的任务,如更新界面元素。 ...
本文将深入探讨 `Handler` 的工作原理,分析其如何在不同线程间进行通信,并通过实例代码来展示其具体用法。 ### Handler 原理分析 #### 1. 消息队列(MessageQueue) `Handler` 的核心概念之一是消息队列,它...
在Android开发中,`Handler`、`Message`和线程是三个非常重要的概念,它们用于在应用程序的不同组件之间实现异步通信和数据传递。本文将深入讲解这些概念,并通过一个简单的实例来帮助初学者理解其工作原理。 首先...
通常,我们传递一个`Looper`实例或`Looper.prepare()`方法来初始化`Handler`。如果未提供`Looper`,则`Handler`将默认使用主线程的`Looper`。这意味着在非主线程中创建`Handler`时,必须明确指定或启动该线程的`...
在这个场景下,它可能是一个包含所有资源和配置文件的Android应用与服务器端交互的实例。 【json+mysql+jsp实现】这表明项目中使用了JSON作为数据交换格式,MySQL作为数据存储,而JSP作为服务器端处理逻辑的工具。...
当在主线程(UI线程)中创建一个Handler实例时,这个Handler会与当前线程的Looper关联。通过post()或sendMessage()方法发送Message,Looper会在适当的时间将其交付给关联的Handler进行处理。这对于避免在主线程执行...
1. 在需要发送消息的地方,通过Handler实例的sendMessage()或post()方法,将Message对象放入消息队列。 2. Looper在后台持续检查消息队列,一旦有新消息,就将其从队列中取出。 3. Looper将取出的消息交给对应的...