- 浏览: 67649 次
- 性别:
- 来自: Mercury
最新评论
一、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");
发表评论
文章已被作者锁定,不允许评论。
-
Android40_Dialog
2011-11-14 00:11 2997Dialog是Android常用的对话框控件。AlertDia ... -
Android39_Clock和TimePicker
2011-11-14 00:08 2361一、AnalogClock和DigitalClock ... -
Android38_ImageView和Gallery
2011-11-14 00:07 3614一、ImageView使用方法 ImageVi ... -
Android37_JSON数据解析
2011-11-08 00:14 2349一、JSON介绍 JSON(JavaSc ... -
Android36_Animations使用(四)
2011-11-08 00:14 3418一、LayoutAnimationsContrlller ... -
Android35_Animations使用(三)
2011-11-08 00:13 2650一、AnimationSet的具体使用方法 ... -
Android34_Animations使用(二)
2011-11-08 00:12 1958在代码中使用Animations可以很方便的调试、运行 ... -
Android33_Animations使用(一)
2011-11-08 00:12 2285一、Animations介绍 Anima ... -
Android31_AppWidget使用(二)
2011-11-05 00:09 2510一、PendingIntent介绍 PendingIn ... -
Android30_AppWidget使用(一)
2011-11-05 00:08 2261一、App Widget定义 App ... -
Android32_Notification用法
2011-11-05 00:09 1888Android系统的状态栏(Status Bar)中有一 ... -
Android29_SeekBar和RatingBar
2011-11-02 23:21 2120一、使用SeekBar步骤: SeekB ... -
Android28_ExpandableListActivity
2011-11-02 23:21 1488ExpandableListActivity就是可扩展的 ... -
Android27_AutoCompleteTextView
2011-11-02 23:21 1092一、创建AutoCompleteTextView ... -
Android26_DatePicker
2011-11-02 23:20 1781一、DatePicker和DatePickerDialo ... -
Android25_Spinner使用方法
2011-11-02 23:20 2816一、创建Spinner的步骤 1.在布局 ... -
Android24_Service初步
2011-10-18 22:27 1008一、Service概念 ... -
Android23_Socket编程
2011-10-18 22:19 1511一、什么是Socket Socket是基 ... -
Android22_WIFI网络操作
2011-10-18 22:12 1694一、什么是WIFI WIFI就是一种无线 ... -
Android21_广播机制(二)
2011-10-18 22:00 1007一、注册BroadcastReceiver的方法 ...
相关推荐
本篇将深入探讨Handler的基本概念、使用方法以及其在多线程环境中的作用。 1. Handler是什么? Handler,中文可译为“处理器”,在Android系统中主要负责处理来自其他线程的消息。它通过发送和处理Message对象,...
在Android应用开发中,Handler、Looper和Message是实现线程间通信的重要机制。这个"Android_Handler的线程队列Demo"旨在演示如何有效地利用Handler来处理线程间的通信,特别是主线程(UI线程)与工作线程之间的交互...
在Android系统中,Handler、Message和Looper构成了一个关键的异步通信机制,即Handler消息处理机制。这个机制允许Android应用程序在不同的线程间传递消息,处理UI更新等操作,是多线程编程中的重要组成部分。下面...
总结来说,"Thread_Handler_MessageDownload"项目通过实践展示了如何在Android中使用Thread进行后台操作,利用Handler和Message在工作线程与主线程之间进行高效、安全的通信,实现网络图片的异步加载。这种方法对于...
在上一篇文章《Android应用程序消息处理机制(Looper、Handler)分析》中,我们分析了Android应用程序的消息处理机制,本文将结合这种消息处理机制来详细分析Android应用程序是如何获得键盘按键消息的。
Android的Handler使用方法总结,不错的文档,跟大家分享分享
【Android_Handler01-源码】是一个关于Android Handler机制的源码分析项目。在Android开发中,Handler、Looper和Message是实现线程间通信的重要组件,尤其在UI更新和异步任务处理上扮演着核心角色。这个源码库可能是...
在Android应用开发中,HandlerMessage1_HandlerMessage是一个关键的主题,涉及到Android系统中的消息处理机制,尤其是Handler、Message和Looper的使用。这些组件是Android异步编程的重要组成部分,用于解决UI线程与...
Handler在android里负责发送和处理消息。它的主要用途有(或者是干什么的): 1)执行计划任务,按计划(定时)发送消息或执行某个Runnanble(使用POST方法); 2)线程间通信,把从其他线程中发送来的消息放入消息...
本文将深入探讨Android中的Handler机制及其使用方法。 首先,理解Handler的基本概念。Handler是Android消息处理系统的一部分,它与Looper和Message紧密协作,用于在不同线程之间传递消息和执行任务。通常,主线程...
Title: Android Handler 深入理解与应用 在Android开发中,Handler机制是处理异步消息传递的关键组件,主要用于在不同的线程之间进行通信,尤其是主线程与工作线程之间的交互。当我们面临需要长时间运行的任务,如...
在Android开发中,`Handler`、`Looper`和`Message`是实现线程间通信和异步处理的关键组件。它们共同构建了一个消息循环系统,使得应用程序可以在不同的线程之间传递和处理消息,尤其是在主线程(UI线程)与工作线程...
这个资源主要有三个Demo文件 是用来展示Handler的异步处理消息的 第一个Demo展示了如何启动线程和暂停线程 第二个Demo采用了Handler的消息队列机制 第三个Demo用HandlerThread的looper来构造一个handler,然后该...
Android 中 Handler 的使用方法和总结 Handler 是 Android 中的一种非常重要的组件,它起到了十分重要的作用。Handler 主要用于异步消息的处理,当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回...
本教程将介绍如何使用Android Studio和Handler组件来创建一个简单的计时器应用。Handler是Android中的一个关键组件,它允许开发者在不同的线程之间发送和处理消息,从而实现异步操作。 首先,我们需要了解Android ...
【Android Handler 使用详解】 Handler 是 Android 平台中用于处理线程间通信的关键组件,尤其在涉及 UI(用户界面)更新时,它扮演着至关重要的角色。在 Android 应用程序启动时,系统会默认创建一个主线程,也...
本示例中的“android demo”就是关于如何利用Handler的`postDelayed`方法和`Runnable`接口来实现一个延时3秒的Splash Screen。下面将详细解释这个过程以及涉及的技术点。 1. **Handler**: Handler是Android中处理...
总结来说,Handler是Android中处理多线程和UI同步的核心工具,理解其工作原理和使用方法对于开发高效、稳定的Android应用至关重要。通过熟练掌握Handler,开发者可以更好地控制应用的执行流程,确保UI响应性和性能。...
在Android中使用AsyncTask和Handler线程间交互的方式,详情参见博客:http://www.cnblogs.com/plokmju/p/android_AsyncTask.html和http://www.cnblogs.com/plokmju/p/android_Handler.html