back >>
1. Handler的作用
* handler 主要用于消息的异步处理(处理一个耗时较长并且可能不一定有结果的操作)
- 我的理解,handler就是一个消息队列的这样的数据结构
- 它提供了一个线程异步处理的方案,可将本线程(当前Activity线程,即HandlerActivity线程)和post到handler里的线程异步执行(也就是并行操作,互不干扰)
- 可以往handler里添加线程对象,也可以删除线程对象。队列的操作方式是先进先出
- 线程对象从消息队列中取出后,就会执行该线程对象的run方法,从而执行指定的操作
* handler例子--控制进度条(工程代码请参考01_14_src.zip)
- handler 里其实有两个队列,一个是线程队列,一个是消息队列
package mars.barhandler;
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.ProgressBar;
/**
* 执行流程
* 1.点击startButton按钮,执行class ButtonListener中的onClick方法
* 2.onClick方法设置进度条可见,handler将updateThread线程对象添加到线程队列中
* 3.updateThread压入到线程队列中后,线程队列中就只有该线程对象,就会立即执行
* 4.updateThread线程对象的run方法运行
* 5.updateBarHandler.sendMessage(msg)执行,是将消息压入到消息队列中
* 6.消息队列中有消息,updateBarHandler对象的handleMessage方法会执行,从消息队列中取消息,并将线程对象再次压入到线程队列中
*
* 由此可见handler中至少有两个队列,一个是线程队列,一个是消息队列
*/
public class TestBarHandler extends Activity {
/** Called when the activity is first created. */
//声明控件变量
ProgressBar bar = null;
Button startButton = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//根据控件的ID得到代表控件的对象,并为按钮设置监听器
bar = (ProgressBar)findViewById(R.id.bar);
startButton = (Button)findViewById(R.id.startButton);
startButton.setOnClickListener(new ButtonListener());// 监听器
}
//当点击startButton按钮时,就会执行ButtonListener的onClick方法
class ButtonListener implements OnClickListener{
@Override
public void onClick(View v) {
// 设置进度条处于可见状态
bar.setVisibility(View.VISIBLE);
updateBarHandler.post(updateThread);//将线程压入到线程队列中
}
}
//使用匿名内部类来复写Handler当中的handleMessage方法
Handler updateBarHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
bar.setProgress(msg.arg1);
Bundle bundle = msg.getData();
updateBarHandler.post(updateThread);//将线程压入到线程队列中
System.out.println("test---->" + bundle.getString("test"));
}
};
//线程类,该类使用匿名内部类的方式进行声明
Runnable updateThread = new Runnable(){
int i = 0 ;
@Override
public void run() {
System.out.println("Begin Thread" + i);
i = i + 10 ;
//得到一个消息对象,Message类是有Android操作系统提供
Message msg = updateBarHandler.obtainMessage();
//将msg对象的arg1参数的值设置为i,用arg1和arg2这两个成员变量传递消息,优点是系统性能消耗较少
msg.arg1 = i ;
Bundle bundle = new Bundle();
bundle.putString("test", "test bundle");
msg.setData(bundle);
try {
//设置当前显示睡眠1秒
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//将msg对象加入到消息队列当中
if( i > 100){
//如果当i的值为100时,就将线程对象从handler当中移除
updateBarHandler.removeCallbacks(updateThread);
System.out.println(">>>>>>");
}else{
updateBarHandler.sendMessage(msg);//send后就会在handleMessage方法中获得该msg
System.out.println("<<<<<<");
}
}
};
class MyThread extends Thread{
public void run(){
}
}
}
2. Handler与线程的关系
* 默认情况下,handler和调用该handler的activity是同一个线程(工程代码见01_15_src.zip)
- 因为handler处理post到线程队列中的线程对象时,其实是直接执行了该线程对象的run方法,而不是start方法
要想真正开辟一个新线程,需要如下操作:
HandlerThread handlerThread = new HandlerThread("handler_thread");
handlerThread.start();
//然后覆写Handler类的方法
class MyHandler extends Handler {
public MyHandler() {
}
public MyHandler(Looper looper) {
super(looper);
}
public void handleMessage(Message msg) {
//接收数据
Bundle b=msg.getData();
int age =b.getInt("age");
System.out.println("age:"+age);
System.out.println(Thread.currentThread().getId());
System.out.println("handlerMessage");
}
}
MyHandler myHandler = new MyHandler(handlerThread.getLooper());
Message msg = myHandler.obtainMessage();//获得消息
Bundle b=new Bundle();
b.putInt("age", 20);
msg.setData(b);
msg.sendToTarget();//发送消息
发送消息的两种方法:
--myHandler.sendMessage(msg);
--msg.sendToTarget();
3. bundle对象
* bundle对象其实就是一个数据存储的工具,一般用于向消息传递数据
- 同hashmap有点像,只是bundle键值对的键是String的,而值可以随便。
* 向消息传递数据的方式:
- 使用Message的成员变量
msg.arg1,msg.arg2,msg.obj等
- 使用bundle
Bundle b=new Bundle();
b.putInt("age", 20);
msg.setData(b);
4. Looper对象
* 循环从队列中取得消息
- 一般自己不创建。android提供了HandlerThread类实现循环从队列中取消息的功能,handlerThread.getLooper()
分享到:
相关推荐
【Android Handler 使用详解】 Handler 是 Android 平台中用于处理线程间通信的关键组件,尤其在涉及 UI(用户界面)更新时,它扮演着至关...正确理解和使用 Handler,对于开发高效且稳定的 Android 应用至关重要。
在Android开发中,`Handler`是一个至关重要的组件,它用于处理主线程中的消息调度,实现UI线程与后台线程之间的通信。`Handler`、`Looper`和`Message`是Android异步处理的核心三剑客,它们共同协作,保证了应用的...
Handler是Android系统中用于线程间通信的重要工具,它允许开发者在不同的线程间传递消息并执行相应的处理。在Android应用开发中,由于主线程(UI线程)负责处理用户交互,因此耗时操作如网络请求、文件下载不应在...
11. **AsyncTask**和**Handler**:两者都是异步编程工具,AsyncTask适合短时间的后台任务,而Handler-Looper-Message机制适合更复杂的通信和定时任务。 12. **权限管理**:Android 6.0及以上版本引入了运行时权限,...
在Android平台上进行游戏开发是一项富有挑战性和趣味性的任务,尤其当你选择开发一款具有深厚文化底蕴的中国象棋游戏时。本文将深入探讨从标题"Android--开发--中国象棋源码.rar"和描述"Android--开发--中国象棋源码...
在Android开发领域,面试是检验开发者技能和经验的重要环节。这份"Android--开发--面试题.rar"压缩包可能包含了各种常见的Android面试问题,旨在帮助应聘者准备面试或提升自己的技术能力。以下是一些可能涵盖的知识...
在Android开发中,`Handler`、`MediaPlayer`和`ThreadLocal`是三个非常重要的概念,它们在构建高效、响应式的应用程序中起到关键作用。本文将深入探讨这些知识点,帮助开发者理解它们的工作原理以及如何在实际项目中...
在 `flutter-permission-handler-master` 文件夹中,可能包含一个示例应用程序,展示了如何在实际项目中应用这些功能。 9. **文档**:作为一个成熟的开源项目,`flutter-permission-handler` 应该有详尽的文档,...
2. **Android开发环境搭建**:讲解如何安装和配置Android Studio,这是Google官方推荐的集成开发环境,包括JDK的安装、SDK Manager的使用,以及AVD(Android Virtual Device)的创建。 3. **Android项目结构**:...
git clone https://github.com/master-atul/react-native-exception-handler-example yarn install react-native run-ios --configuration Release或react-native run-android --variant=release 即使在开发模式...
在Android开发中,自定义View是一项重要的技能,它允许开发者根据特定需求构建独特的用户界面元素。本主题将深入探讨如何在Android Studio中实现一个自定义View,特别关注数独游戏的实现,以及如何利用Handler进行...
总结,Handler机制是Android开发中的重要知识点,它解决了在多线程环境中更新UI的问题,通过消息传递实现了线程间的通信。熟练掌握Handler的使用,能提升应用的性能和用户体验。在实际开发中,要注重最佳实践,避免...
在Android开发中,Handler是实现线程间通信的关键组件,尤其在处理UI更新时尤为重要。本文将深入探讨Android中的Handler机制及其使用方法。 首先,理解Handler的基本概念。Handler是Android消息处理系统的一部分,...
这个项目对于那些希望踏入Android开发领域的人来说,无疑是一个理想的起点,因为它不仅提供了实际的代码实现,还包含了详尽的注释,使得学习过程更加清晰易懂。 在Android开发中,一个完整的项目通常包括多个组件和...
在Android开发过程中,面试题是衡量开发者技能和知识深度的重要工具。"安卓巴士总结"这个压缩包文件很可能是汇集了Android开发中常见的面试问题和解答,涵盖了多个关键领域。以下是一些可能涵盖的知识点,包括但不...
在Android开发中,Handler是处理多线程通信的关键机制,尤其在UI更新和异步任务中扮演着重要角色。本文将深入探讨Handler的工作原理、如何使用以及它在处理多线程中的应用。 Handler的主要功能是发送和处理消息,它...
在Android开发中,Splash Screen(启动屏)是应用程序启动时展示的一个短暂页面,通常用于加载应用数据或展示品牌标识。本示例中的“android demo”就是关于如何利用Handler的`postDelayed`方法和`Runnable`接口来...
在Android应用开发中,ANR(Application Not Responding)是一个常见的问题,表示用户界面无响应,这通常是由于主线程被长时间阻塞导致的。`Android-ANR-WatchDog`是一个专门为解决这个问题而设计的开源工具,它能够...
总的来说,实现“Android开发--仿微信语音对讲录音”涉及到了音频处理、事件监听、文件操作、用户界面设计等多个技术点,需要开发者具备扎实的Android基础知识和良好的问题解决能力。通过以上步骤,我们可以构建一个...
在Android开发中,性能优化是提升用户体验的关键环节。"Android-performance-optimization"这个主题涵盖了开发者需要关注的各种优化策略。本篇文章将详细讲解Android性能优化的一些核心知识点,并以"Handler产生的...