`

Android开发 - Handler的使用

阅读更多

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的使用

    【Android Handler 使用详解】 Handler 是 Android 平台中用于处理线程间通信的关键组件,尤其在涉及 UI(用户界面)更新时,它扮演着至关...正确理解和使用 Handler,对于开发高效且稳定的 Android 应用至关重要。

    android学习--handler

    在Android开发中,`Handler`是一个至关重要的组件,它用于处理主线程中的消息调度,实现UI线程与后台线程之间的通信。`Handler`、`Looper`和`Message`是Android异步处理的核心三剑客,它们共同协作,保证了应用的...

    玩转Android---组件篇---Handler的使用

    Handler是Android系统中用于线程间通信的重要工具,它允许开发者在不同的线程间传递消息并执行相应的处理。在Android应用开发中,由于主线程(UI线程)负责处理用户交互,因此耗时操作如网络请求、文件下载不应在...

    Android--开发--doc.rar

    11. **AsyncTask**和**Handler**:两者都是异步编程工具,AsyncTask适合短时间的后台任务,而Handler-Looper-Message机制适合更复杂的通信和定时任务。 12. **权限管理**:Android 6.0及以上版本引入了运行时权限,...

    Android--开发--中国象棋源码.rar

    在Android平台上进行游戏开发是一项富有挑战性和趣味性的任务,尤其当你选择开发一款具有深厚文化底蕴的中国象棋游戏时。本文将深入探讨从标题"Android--开发--中国象棋源码.rar"和描述"Android--开发--中国象棋源码...

    Android--开发--面试题.rar

    在Android开发领域,面试是检验开发者技能和经验的重要环节。这份"Android--开发--面试题.rar"压缩包可能包含了各种常见的Android面试问题,旨在帮助应聘者准备面试或提升自己的技术能力。以下是一些可能涵盖的知识...

    Android-Handler.7z

    在Android开发中,`Handler`、`MediaPlayer`和`ThreadLocal`是三个非常重要的概念,它们在构建高效、响应式的应用程序中起到关键作用。本文将深入探讨这些知识点,帮助开发者理解它们的工作原理以及如何在实际项目中...

    flutter-permission-handler,flutter的许可插件。这个插件提供了一个跨平台(ios,android)api来请求和检查权限。.zip

    在 `flutter-permission-handler-master` 文件夹中,可能包含一个示例应用程序,展示了如何在实际项目中应用这些功能。 9. **文档**:作为一个成熟的开源项目,`flutter-permission-handler` 应该有详尽的文档,...

    Android开发-PPT教学(全)

    2. **Android开发环境搭建**:讲解如何安装和配置Android Studio,这是Google官方推荐的集成开发环境,包括JDK的安装、SDK Manager的使用,以及AVD(Android Virtual Device)的创建。 3. **Android项目结构**:...

    react-native-exception-handler-example:一个示例仓库显示了如何集成react-native-exception-handler

    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-AndroidStudio(二十五)数独(2)Handler延迟

    在Android开发中,自定义View是一项重要的技能,它允许开发者根据特定需求构建独特的用户界面元素。本主题将深入探讨如何在Android Studio中实现一个自定义View,特别关注数独游戏的实现,以及如何利用Handler进行...

    【Android开发入门】Android线程之Handler

    总结,Handler机制是Android开发中的重要知识点,它解决了在多线程环境中更新UI的问题,通过消息传递实现了线程间的通信。熟练掌握Handler的使用,能提升应用的性能和用户体验。在实际开发中,要注重最佳实践,避免...

    android中的handler的使用方法

    在Android开发中,Handler是实现线程间通信的关键组件,尤其在处理UI更新时尤为重要。本文将深入探讨Android中的Handler机制及其使用方法。 首先,理解Handler的基本概念。Handler是Android消息处理系统的一部分,...

    Android项目-谁是歌手

    这个项目对于那些希望踏入Android开发领域的人来说,无疑是一个理想的起点,因为它不仅提供了实际的代码实现,还包含了详尽的注释,使得学习过程更加清晰易懂。 在Android开发中,一个完整的项目通常包括多个组件和...

    Android--开发-- 面试题 安卓巴士总结.rar

    在Android开发过程中,面试题是衡量开发者技能和知识深度的重要工具。"安卓巴士总结"这个压缩包文件很可能是汇集了Android开发中常见的面试问题和解答,涵盖了多个关键领域。以下是一些可能涵盖的知识点,包括但不...

    Android中handler的使用

    在Android开发中,Handler是处理多线程通信的关键机制,尤其在UI更新和异步任务中扮演着重要角色。本文将深入探讨Handler的工作原理、如何使用以及它在处理多线程中的应用。 Handler的主要功能是发送和处理消息,它...

    Android-ANR-WatchDog一个用于检测AndroidANR(应用不响应)的watchdog

    在Android应用开发中,ANR(Application Not Responding)是一个常见的问题,表示用户界面无响应,这通常是由于主线程被长时间阻塞导致的。`Android-ANR-WatchDog`是一个专门为解决这个问题而设计的开源工具,它能够...

    Android开发--仿微信语音对讲录音

    总的来说,实现“Android开发--仿微信语音对讲录音”涉及到了音频处理、事件监听、文件操作、用户界面设计等多个技术点,需要开发者具备扎实的Android基础知识和良好的问题解决能力。通过以上步骤,我们可以构建一个...

    Android代码-Android-performance-optimization

    在Android开发中,性能优化是提升用户体验的关键环节。"Android-performance-optimization"这个主题涵盖了开发者需要关注的各种优化策略。本篇文章将详细讲解Android性能优化的一些核心知识点,并以"Handler产生的...

    Android--开发--系统原理与开发要点详解_培训课件.rar

    Android作为全球最广泛使用的移动操作系统,其开发技术与系统原理是每一个Android开发者必须深入理解的基础。本培训课件旨在详细阐述Android系统的内部工作机制以及开发过程中需要注意的关键点,帮助开发者提升技能...

Global site tag (gtag.js) - Google Analytics