`
Bauble
  • 浏览: 67649 次
  • 性别: Icon_minigender_1
  • 来自: Mercury
社区版块
存档分类
最新评论

Android14_Handler使用方法(二)

阅读更多

一、Handler与线程

Handler与使用这个Handler的Activity是处在同一个线程中的。Handler并不会调用线程的start方法,而是直接调用线程的run方法。编写线程程序的时候一般可以实现Runnable接口,或者继承Thread类,无论哪种方法都会重写run方法,但是启动线程的时候并不是调用run方法,而是调用start方法。所以,Handler直接调用run方法,则说明并没有启动新的线程,而是还在当前的线程当中。

测试实例:

    HandlerActivity.java

package com.android.activity;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;

public class HandlerActivity extends Activity {

	private Handler handler = new Handler();
	
	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        handler.post(r);
        setContentView(R.layout.main);
        
		System.out.println("Activity --> "+Thread.currentThread().getId());
		System.out.println("Activity --> "+Thread.currentThread().getName());
    }
	
	Runnable r = new Runnable(){
		public void run() {
			System.out.println("Handler --> "+Thread.currentThread().getId());
			System.out.println("Handler --> "+Thread.currentThread().getName());
			
			try{
				Thread.sleep(5000);
			}catch(Exception e){
				e.printStackTrace();
			}
		}
	};
}

 

  在这个例子中,在run方法和onCreate方法中,分别打印出当前线程的id和name,同时在run方法中休眠5000ms,并且将

handler.post(r);

 这句代码写在

setContentView(R.layout.main);

 就是为了验证Handler和Activity是否是处在同一个线程中。

如果handler与Activity不是在同一个线程中,则handler调用的run方法执行sleep的时候,Activity的界面直接就会显示出来,如果是在同一个线程中的话,则会延迟5秒之后才显示出来。这样很容易证实Handler与使用这个Handler的Activity是处在同一个线程中的。

输出结果:


二、Bundle的用法

Bundle是一个以String类型为键,可以是其他类型为值的映射。是一个数据存储工具,类似于Map,只不过键的类型是固定的。

BundleActivity.java

String name ="test bundle";
Bundle bundle = new Bundle();
bundle.putString("name", name);

Intent intent = new Intent(BundleActivity.this,OtherActivity.class);
intent.putExtras(bundle);
startActivity(intent);

 OtherActivity.java

String name=(String) getIntent().getExtras().get("name");
 

 

三、在新线程当中处理消息的方法

由于Handler与使用这个Handler的Activity是处在同一个线程中的,但是平时使用Handler都是为了新开一个线程处理那些耗时长的操作,如数据下载等。如果不另起一个线程的话,当前的Activity就会没有反应,用户就不能够同时做一些其他操作。

为了解决上面的问题,就引入了Looper的概念。Looper是一个Android框架所提供的一个类,Looper提供了一种循环着从队列中取出消息这种功能。HandlerThread类实现Looper的功能,一般就使用HandlerThread实现循环处理消息功能。

例子程序:

HandlerActivity.java

package com.android.activity;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;

public class BundleActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        System.out.println("Activity --> "+Thread.currentThread().getId());
        
        //生成一个HandlerThread对象,实现类使用Looper来处理消息队列的功能
        HandlerThread handlerThread = new HandlerThread("handler_thread");
        handlerThread.start();
        
        
        MyHandler myHandler = new MyHandler(handlerThread.getLooper());
        Message msg = myHandler.obtainMessage();
        //每次发送消息对象的时候,都会调用handleMessage方法,发送到目标对象,哪一个Handler得到的message就会发送到哪
        msg.sendToTarget();
    }
    
    class MyHandler extends Handler{
    	public MyHandler() {}
    	
    	public MyHandler(Looper looper){
    		super(looper);
    	}
    	
    	public void handleMessage(Message msg){
    		System.out.println("Handler --> "+Thread.currentThread().getId());
    		System.out.println("handlerMessage");
    	}
    }
}

 

其中:

 MyHandler myHandler = new MyHandler(handlerThread.getLooper());

MyHandler类有一个带参数的构造方法,构造方法传递一个looper,意味着当前这个handler使用looper所在的这个线程,来处理消息,也就是说将handler绑定到了looper所在的线程上,而不是Activity的线程了。

在使用getLoop()方法之前必须先调用该类的start()方法,否则getLooper()方法将得到空值。

另外:

Message有args1和args2两个成员变量,可以用来传递整型参数,相对于setDate()方法来说使用这两个参数消耗比较小。

Message还有obj这样一个变量,可以用来传递对象。

如果传递大量数据的话,可以使用Message的setDate方法。

Bundle bundle = new Bundle();
bundle.putInt("number",100);
bundle.putString("name","bauble");
msg.setDate();
msg.sendToTarget();

  可以在handleMessage()方法中取出:

Bundle b = msg.getDate();
int number = b.getInt("number");
String name = b.getString("name");
  • 大小: 6.5 KB
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Android_Handler详解(一)

    本篇将深入探讨Handler的基本概念、使用方法以及其在多线程环境中的作用。 1. Handler是什么? Handler,中文可译为“处理器”,在Android系统中主要负责处理来自其他线程的消息。它通过发送和处理Message对象,...

    Android_Handler的线程队列Demo

    在Android应用开发中,Handler、Looper和Message是实现线程间通信的重要机制。这个"Android_Handler的线程队列Demo"旨在演示如何有效地利用Handler来处理线程间的通信,特别是主线程(UI线程)与工作线程之间的交互...

    Android_Handler消息处理机制

    在Android系统中,Handler、Message和Looper构成了一个关键的异步通信机制,即Handler消息处理机制。这个机制允许Android应用程序在不同的线程间传递消息,处理UI更新等操作,是多线程编程中的重要组成部分。下面...

    Thread_Handler_MessageDownload.zip

    总结来说,"Thread_Handler_MessageDownload"项目通过实践展示了如何在Android中使用Thread进行后台操作,利用Handler和Message在工作线程与主线程之间进行高效、安全的通信,实现网络图片的异步加载。这种方法对于...

    Android-Event-driver.zip_Looper_android_android Handler_event

    在上一篇文章《Android应用程序消息处理机制(Looper、Handler)分析》中,我们分析了Android应用程序的消息处理机制,本文将结合这种消息处理机制来详细分析Android应用程序是如何获得键盘按键消息的。

    Android的Handler使用方法总结

    Android的Handler使用方法总结,不错的文档,跟大家分享分享

    Android_Handler01-源码.rar

    【Android_Handler01-源码】是一个关于Android Handler机制的源码分析项目。在Android开发中,Handler、Looper和Message是实现线程间通信的重要组件,尤其在UI更新和异步任务处理上扮演着核心角色。这个源码库可能是...

    Android应用源码之HandlerMessage1_HandlerMessage.zip

    在Android应用开发中,HandlerMessage1_HandlerMessage是一个关键的主题,涉及到Android系统中的消息处理机制,尤其是Handler、Message和Looper的使用。这些组件是Android异步编程的重要组成部分,用于解决UI线程与...

    android_handler学习笔记

    Handler在android里负责发送和处理消息。它的主要用途有(或者是干什么的):  1)执行计划任务,按计划(定时)发送消息或执行某个Runnanble(使用POST方法);  2)线程间通信,把从其他线程中发送来的消息放入消息...

    android中的handler的使用方法

    本文将深入探讨Android中的Handler机制及其使用方法。 首先,理解Handler的基本概念。Handler是Android消息处理系统的一部分,它与Looper和Message紧密协作,用于在不同线程之间传递消息和执行任务。通常,主线程...

    android_Handler整理总结

    Title: Android Handler 深入理解与应用 在Android开发中,Handler机制是处理异步消息传递的关键组件,主要用于在不同的线程之间进行通信,尤其是主线程与工作线程之间的交互。当我们面临需要长时间运行的任务,如...

    Android_Handler,Looper,Message

    在Android开发中,`Handler`、`Looper`和`Message`是实现线程间通信和异步处理的关键组件。它们共同构建了一个消息循环系统,使得应用程序可以在不同的线程之间传递和处理消息,尤其是在主线程(UI线程)与工作线程...

    Android_Handler

    这个资源主要有三个Demo文件 是用来展示Handler的异步处理消息的 第一个Demo展示了如何启动线程和暂停线程 第二个Demo采用了Handler的消息队列机制 第三个Demo用HandlerThread的looper来构造一个handler,然后该...

    android中Handler的使用方法和总结

    Android 中 Handler 的使用方法和总结 Handler 是 Android 中的一种非常重要的组件,它起到了十分重要的作用。Handler 主要用于异步消息的处理,当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回...

    Android Studio通过Handler制作简单的计时器

    本教程将介绍如何使用Android Studio和Handler组件来创建一个简单的计时器应用。Handler是Android中的一个关键组件,它允许开发者在不同的线程之间发送和处理消息,从而实现异步操作。 首先,我们需要了解Android ...

    android-Handler的使用

    【Android Handler 使用详解】 Handler 是 Android 平台中用于处理线程间通信的关键组件,尤其在涉及 UI(用户界面)更新时,它扮演着至关重要的角色。在 Android 应用程序启动时,系统会默认创建一个主线程,也...

    android demo,使用Handler的postDelay,Runnable run实现延时3秒的splash。

    本示例中的“android demo”就是关于如何利用Handler的`postDelayed`方法和`Runnable`接口来实现一个延时3秒的Splash Screen。下面将详细解释这个过程以及涉及的技术点。 1. **Handler**: Handler是Android中处理...

    Android中handler的使用

    总结来说,Handler是Android中处理多线程和UI同步的核心工具,理解其工作原理和使用方法对于开发高效、稳定的Android应用至关重要。通过熟练掌握Handler,开发者可以更好地控制应用的执行流程,确保UI响应性和性能。...

    在Android中使用AsyncTask和Handler线程间交互的方式

    在Android中使用AsyncTask和Handler线程间交互的方式,详情参见博客:http://www.cnblogs.com/plokmju/p/android_AsyncTask.html和http://www.cnblogs.com/plokmju/p/android_Handler.html

Global site tag (gtag.js) - Google Analytics