- 浏览: 332229 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
xuanyuanxiaoxue:
...
Android - LayoutInflater -
柴兴博:
不错 多谢
Android 悬浮Activity并可拖动(访悬浮歌词) -
di1984HIT:
写的很好,我收藏一下。
java之动态代理模式(JDK和cglib) -
chinacssnj:
待测试,明天测,测试的结果发给大家
网络开发上传文件到服务器 -
fx_199182:
...
Android之MediaPlayer
二:sendMessage版本的Handler的使用
这里介绍几种模型:
a、默认的Handler(消息处理队列挂在主线程上)
运行结果:package com.dxyh.test;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity
implements OnClickListener {
private final static String TAG = "HandlerTest";
private final static int TASK_BEGIN = 1;
private final static int TASK_1 = 2;
private final static int TASK_2 = 3;
private final static int TASK_END = 4;
private Button btnStart = null;
private Button btnStop = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnStart = (Button) findViewById(R.id.btn_start);
btnStart.setOnClickListener(this);
btnStop = (Button) findViewById(R.id.btn_stop);
btnStop.setOnClickListener(this);
Log.i(TAG, "[M_TID:" + Thread.currentThread().getId() + "]");
}
Handler mHandler = new Handler() {
// 注意:在各个case后面不能做太耗时的操作,否则出现ANR对话框
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case TASK_BEGIN:
Log.i(TAG, "[H_TID:" +
Thread.currentThread().getId() + "] Get TASK_BEGIN");
break;
case TASK_1:
Log.i(TAG, "[H_TID:" +
Thread.currentThread().getId() + "] Get TASK_1");
break;
case TASK_2:
Log.i(TAG, "[H_TID:" +
Thread.currentThread().getId() + "] Get TASK_2");
break;
case TASK_END:
Log.i(TAG, "[H_TID:" +
Thread.currentThread().getId() + "] Get TASK_END");
finish();
break;
}
super.handleMessage(msg);
}
};
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_start:
// 启动任务(消息只有标识,立即投递)
mHandler.sendEmptyMessage(TASK_BEGIN);
Log.i(TAG, "Send TASK_BEGIN to handler.");
// 开始任务1(在mHandler的消息队列中获取一个Message对象,避免重复构造)
Message msg1 = mHandler.obtainMessage(TASK_1);
msg1.obj = "This is task1";
mHandler.sendMessage(msg1);
Log.i(TAG, "Send TASK_1 to handler.");
// 开启任务2(和上面类似)
Message msg2 = Message.obtain();
msg2.arg1 = 10;
msg2.arg2 = 20;
msg2.what = TASK_2;
mHandler.sendMessage(msg2);
Log.i(TAG, "Send TASK_2 to handler.");
break;
case R.id.btn_stop:
// 结束任务(空消息体,延时2s投递)
mHandler.sendEmptyMessageDelayed(TASK_END, 2000);
Log.i(TAG, "Send TASK_END to handler.");
break;
}
}
}
b、消息队列仍绑定在主线程上,但在子线程中发送消息。
运行结果:package com.dxyh.test;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
public class MainActivity extends Activity {
private final static String TAG = "HandlerTest";
private final static int TASK_BEGIN = 1;
private final static int TASK_1 = 2;
private final static int TASK_2 = 3;
private final static int TASK_END = 4;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.i(TAG, "[M_TID:" + Thread.currentThread().getId() + "]" +
"This is in main thread.");
workThread.start();
}
Handler mHandler = new Handler() {
// 注意:在各个case后面不能做太耗时的操作,否则出现ANR对话框
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case TASK_BEGIN:
Log.i(TAG, "[H_TID:" +
Thread.currentThread().getId() + "] Get TASK_BEGIN");
break;
case TASK_1:
Log.i(TAG, "[H_TID:" +
Thread.currentThread().getId() + "] Get TASK_1");
break;
case TASK_2:
Log.i(TAG, "[H_TID:" +
Thread.currentThread().getId() + "] Get TASK_2");
break;
case TASK_END:
Log.i(TAG, "[H_TID:" +
Thread.currentThread().getId() + "] Get TASK_END");
finish();
break;
}
super.handleMessage(msg);
}
};
Thread workThread = new Thread() {
// 你可以在run方法内做任何耗时的操作,然后将结果以消息形式投递到主线程的消息队列中
@Override
public void run() {
// 启动任务(消息只有标识,立即投递)
mHandler.sendEmptyMessage(TASK_BEGIN);
Log.i(TAG, "[S_TID:" + Thread.currentThread().getId() + "]" +
"Send TASK_START to handler.");
// 开始任务1(在mHandler的消息队列中获取一个Message对象,避免重复构造)
Message msg1 = mHandler.obtainMessage(TASK_1);
msg1.obj = "This is task1";
mHandler.sendMessage(msg1);
Log.i(TAG, "[S_TID:" + Thread.currentThread().getId() + "]" +
"Send TASK_1 to handler.");
// 开启任务2(和上面类似)
Message msg2 = Message.obtain();
msg2.arg1 = 10;
msg2.arg2 = 20;
msg2.what = TASK_2;
mHandler.sendMessage(msg2);
Log.i(TAG, "[S_TID:" + Thread.currentThread().getId() + "]" +
"Send TASK_2 to handler.");
// 结束任务(空消息体,延时2s投递)
mHandler.sendEmptyMessageDelayed(TASK_END, 2000);
Log.i(TAG, "[S_TID:" + Thread.currentThread().getId() + "]" +
"Send TASK_END to handler.");
}
};
}
发表评论
-
Android中AsyncTask的简单用法
2012-01-13 16:00 1169在开发Android移动客户端的时候往往要使用多线程来进行操 ... -
Android应用的自动升级、更新模块的实现 .
2011-11-16 14:01 679http://www.eoeandroid.com/threa ... -
一个APK反编译利器Apktool
2011-11-16 13:54 1591一个APK反编译利器Apktool APK 本地化 ... -
自定义Android标题栏TitleBar布局
2011-11-14 14:13 1261很多网友发现自己Android程序的标题栏TitleBar区域 ... -
Android GPS获取地理位置 .
2011-11-14 14:11 863import android.app.Activity; i ... -
android ListView详解
2011-11-14 13:48 1064在android开发中ListView是比较常用的组件,它以列 ... -
Android之Content provider 详解
2011-11-14 13:35 2481Android是如何实现应用程序之间数据共享的?一个应用程序可 ... -
Android源码地址
2011-11-12 19:14 1055http://blog.csdn.net/ilittleone ... -
android之File
2011-11-11 22:39 20111:Fileservice package cn.itcas ... -
Android知识补漏
2011-11-09 22:33 01:AndroidManifiest.xml < ... -
深入剖析Android消息机制
2011-11-09 14:13 969在Android中,线程内部或者线程之间进行信息交互时经常会使 ... -
Android之Handler详解(四)
2011-11-09 14:00 1292d、自己创建新的线程,然后在新线程中创建Looper,主线程调 ... -
Android之Handler详解(三)
2011-11-09 13:58 1370c、将消息队列绑定到子线程上,主线程只管通过Handl ... -
Android之Handler详解(一)
2011-11-09 13:22 2295一个Handler允许你发送和处理消息(Message)以及 ... -
关于StartActivityForResult方法的使用
2011-10-31 17:11 1108根据方法名可知 这个方法是要得到启动后的Activity返回的 ... -
Android 悬浮Activity并可拖动(访悬浮歌词)
2011-10-24 16:23 2112天天动听, 这款Android手机上的音乐播放器,相信不少朋友 ... -
Android GWES
2011-10-24 16:13 1205第八章 Android GWES 8.1 View Syst ... -
Android系统服务-WindowManager
2011-10-24 16:10 1454WindowManager是Android中一个重要的服务 ... -
http通信
2011-10-15 17:31 1103HTTP(HyperText Transfer Proto ... -
android网络与通信(三种网络接口简述 )
2011-10-15 17:27 1440标准Java接口 java.net.*提供与联网有关的类 ...
相关推荐
【Android_Handler详解(一)】 在Android开发中,Handler是一个至关重要的组件,它与线程、消息队列和Looper紧密关联,用于实现不同线程间的通信。本篇将深入探讨Handler的基本概念、使用方法以及其在多线程环境中的...
Android Handler类详解 Android Handler类详解 Android Handler类详解 Android Handler类详解
Android 多线程Handler/Message机制详解 Android 多线程机制是 Android 应用程序中最重要的组件之一,它允许应用程序在后台执行一些操作,而不影响用户的交互体验。在 Android 中,多线程机制是基于 Handler 和 ...
Android Handler详解-中国移动开发者社区 Android Handler详解-中国移动开发者社区
### Android开发工程师面试题之Handler详解 在Android开发过程中,Handler是进行线程间通信的重要机制之一,尤其在实现异步任务更新UI等场景中扮演着关键角色。本篇文章将围绕Handler的工作原理、核心组件及其实现...
【Android Handler 使用详解】 Handler 是 Android 平台中用于处理线程间通信的关键组件,尤其在涉及 UI(用户界面)更新时,它扮演着至关重要的角色。在 Android 应用程序启动时,系统会默认创建一个主线程,也...
Handler是Android中的一个类,它用于在不同的线程之间发送和处理消息。通常,我们使用Handler配合Looper和Message来实现在主线程(UI线程)中执行后台任务的结果。Looper是消息队列的循环器,它不断检查消息队列并...
Handler是Android系统中用于线程间通信的关键组件,它的内部实现原理涉及到Thread、MessageQueue和Looper等核心类。首先,我们需要理解线程在操作系统中的基本概念,线程是程序执行的最小单位,每个线程都有自己的...
7. **多线程与并发**:Android应用需要处理复杂的多线程场景,源码可能包含Handler、AsyncTask、Thread、Service等的使用,以实现后台任务和避免主线程阻塞。 8. **权限管理**:随着Android系统对权限管理的加强,...
Handler和Looper详解 Handler和Looper是Android系统中两个非常重要的组件,它们之间相互关联,共同实现了Android系统中的消息处理机制。在本文中,我们将对Handler和Looper进行详细的解释,并探讨它们在Android系统...
根据提供的标题“Android应用开发详解.pdf”以及描述“Android应用开发详解.pdf”,我们可以推断这份文档主要涵盖了关于Android平台上的应用程序开发的相关知识和技术。虽然提供的部分内容似乎并不包含具体的信息,...
"Android优化技术详解"这一主题涵盖了多个方面,旨在帮助开发者构建高效、流畅的应用程序。下面,我们将深入探讨这些关键技术点。 首先,我们要理解Android应用性能的基础——内存管理。Android系统采用Dalvik/ART...
《Android应用开发详解》这本书是Android开发者们的重要参考资料,它深入浅出地讲解了Android应用开发的各个环节。源码作为书中的实践部分,是理论知识的直观体现,可以帮助读者更好地理解和掌握Android编程技术。这...
总结总结 Android的消息机制Handler是线程间通信的关键工具,它允许开发者在后台线程执行耗时操作,而将UI更新交由主线程处理,保证了UI操作的安全性和性能。理解Handler、Looper和MessageQueue的工作原理以及它们...
### Message,MessageQueue,Looper,Handler详解 #### 一、几个关键概念 ##### 1、MessageQueue:消息队列 MessageQueue是一种数据结构,顾名思义,它充当了一个消息队列的角色,用来存放各种消息对象。每一个线程...
通过深入学习这些知识点,结合《Android应用开发详解与代码(清晰版)》中的实例和实践,新手开发者将能够逐步构建自己的Android应用,开启移动开发之旅。书中可能涵盖了这些概念的详细解释和实际操作步骤,对于渴望...
下面是一段大家都比较熟悉的代码: 代码如下:Handler handler = new Handler(); handler.post(myThread); //使用匿名内部类创建一个线程myThreadRunnable mythread = new Runnable() {public void run() {}};一开始...
### Android Handler运行原理详解 #### 一、引言 在Android开发中,线程间通信是非常重要的技术之一,其中Handler机制被广泛应用于实现主线程与子线程之间的数据交互。Handler机制不仅简单易用,而且功能强大,是...
第二,Android应用的生命周期管理是源码分析的重要部分。每个组件都有其特定的生命周期方法,如onCreate()、onStart()、onResume()、onPause()、onStop()和onDestroy()等。通过源码,我们可以看到这些方法如何被调用...
Handler是Android系统中用于处理异步消息的核心组件,它的主要职责是协调线程间的通信,尤其是在主线程(UI线程)与工作线程之间。在Android应用开发中,由于主线程负责更新用户界面,因此任何长时间运行的任务都...