`
byandby
  • 浏览: 1696033 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android Handler的使用(二)

阅读更多
Handler的使用(二)
一、 Handler与线程的关系
Handler在默认情况下,实际上它和调用它的Activity是处于同一个线程的。
例如在Handler的使用(一)的示例1中,虽然声明了线程对象,但是在实际调用当中它并没有调用线程的start()方法,而是直接调用当前线程的run()方法。
通过一个例子来证实一下
示例1:一个Android应用程序,在Activity中创建Handler和线程对象,并且在Activity的onCreate()方法中输出当前线程的id和名字,然后在线程对象的run方法中也打印输出下当前线程的id和名字。如果说,Activity输出的结果与线程对象输出的结果是一样的,那么就表示它们使用的是同一个线程。
下面是Activity代码:

package android.handler;

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

public class HandlerTwo extends Activity {
    /** Called when the activity is first created. */
	
	Handler handler = new Handler();
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //在设置布局文件之前先调用post方法,
        //表示在执行完线程之后才会显示布局文件中的内容,而线程中又设置了休眠10秒钟,
        //所以最终效果为,先显示应用程序主界面,等待10秒钟之后才显示布局文件中的内容
        handler.post(r);     
        setContentView(R.layout.main);
        System.out.println("activity id--->"+Thread.currentThread().getId());
        System.out.println("activity name--->"+Thread.currentThread().getName());
    }
    
    Runnable r = new Runnable(){

		public void run() {
			//输出当前线程的id和name
			//如果这里输出的线程id、name与上面onCreate()方法中输出的线程id、name相同的话,
			//那么则表示,他们使用的是同一个线程
			System.out.println("runnable_id--->"+Thread.currentThread().getId());
			System.out.println("runnable_name--->"+Thread.currentThread().getName());
			try{
				Thread.sleep(10000);	//让线程休眠10秒
			}catch(InterruptedException e){
				e.printStackTrace();
			}
		}
    };
}


下图是执行的结果:



根据结果可以看出,两个输出的id和name都相同,它们使用的是同一个线程。

现在将Activity中的代码修改一下,新建一个线程Thread,然后调用线程的start()方法,再观察一下控制台的输出结果。

这里只要将上面的代码稍微修改一下就可以了
1、先将handler.post(r)注释掉
2、再添加下面两句代码就OK了

        //handler.post(r);     
        Thread t = new Thread(r);
        t.start();


输出结果:



从这个输出结果中可以看出,这次线程对象的id、name与activity里的线程id、name完全不一样了,由此可见,它们现在使用的不是同一个线程。

这个例子中还掩饰了一个效果,就是平时我们是将Handler的post()方法放在setContentView(R.layout.main)这个方法之后调用,将设置完布局之后再执行其他的操作,而在这个例子中,是将Handler的post()方法放在setContent()方法之前调用,而post里传递的线程对象的run()方法呢,又执行了休眠线程10秒钟,所以运行实现的效果会是,当程序运行后,首先Activity上没有任何内容,过来10秒之后,才会显示Activity里的内容。

二、 Bundle和如何在新线程中处理消息
首先介绍一下Bundle:
Bundle它是一个以string为键,可以由其他数据类型作为值的一个mapping,相当于把数据当成一个包。在初学的阶段可以将它当成特殊的一个HashMap对象,不过HashMap的键和值都是Object类型的,而Bundle的键却是String类型。
通过一个例子来使用一下Bundle和如何在新线程中处理消息
示例2:一个Android应用程序,先打印Activity当前使用的线程id,然后再创建一个新线程,使用Bundl存储值,最后打印出线程的id和Bundle中存储的值。
看一下输出结果:



唉,这个好复杂好多了,懒得一步步写了,大家直接看源码吧,汗~


项目已经打包上传到附件了,有需要的可以下载。
注:示例1和示例2是在同一个应用程序中,当运行程序的时候默认的是启动示例1的Activity,如果要运行示例2的Activity,那么就将应用程序中的AndroidManifest.xml文件里的Activity标签的name修改成HandlerTest2就OK了。
  • 大小: 27.1 KB
  • 大小: 34.7 KB
  • 大小: 42.5 KB
6
1
分享到:
评论
3 楼 qinyt 2013-06-25  
为什么两个例子打印出的Id和name 顺序不一样?
2 楼 finally_mm 2011-02-24  
Handler使用(一)的例子2
1 楼 finally_mm 2011-02-24  
是不是这样:
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;

public class ProgressBarHandlerTest extends Activity {
    /** Called when the activity is first created. */
private ProgressBar progressBar;
private Button startButton;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        progressBar = (ProgressBar)findViewById(R.id.progressbar);
        startButton = (Button)findViewById(R.id.startButton);
        startButton.setOnClickListener(new OnClickListener(){
        public void onClick(View v) {
    //设置进度条为可见状态
    progressBar.setVisibility(View.VISIBLE);
    updateBarHandler.post(updateThread);
    System.out.println("Begin Thread:");
    }
        });
    }
   
    //创建一个Handler时一定要关联一个Looper实例,在Handler中机制中Looper是最为核心的,它一直处于循环读MessageQueue,
    //有要处理的Message就将Message发送给当前的Handler实例来处理
    //默认构造方法Handler(),它是关联当前UI Thread的Looper
    //使用匿名内部类来覆写Handler当中的handlerMessage()方法
    Handler updateBarHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
progressBar.setProgress(msg.arg1);
if(msg.arg1<=100){
// updateBarHandler.post(updateThread); //将要执行的线程放入到队列当中
updateBarHandler.postDelayed(updateThread, 1000);
}else{
updateBarHandler.removeCallbacks(updateThread); //将线程对象从队列中移除
}
}
    };
   
    //线程类,该类使用匿名内部类的方式进行声明
    Runnable updateThread = new Runnable(){
    int i=0;
public void run() {
System.out.println("i="+i);
i+=10;
//得到一个消息对象,Message类是android系统提供的
Message msg = updateBarHandler.obtainMessage();
msg.arg1 = i; //用arg1、arg2这两个成员变量传递消息,优点是系统性能消耗较少
updateBarHandler.sendMessage(msg);//将Message对象加入到消息队列当中
}
    };
}

相关推荐

    模拟Android Handler机制Demo

    【Android Handler机制】是Android应用程序中用于线程间通信的核心组件,它与Looper和Message紧密配合,实现消息的发送、处理以及线程间的同步。在Android应用开发中,尤其是涉及到UI更新时,Handler机制显得尤为...

    android-Handler的使用

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

    androidHandler测试的demo

    在“androidHandler测试的demo”中,我们可以预期包含以下内容: 1. 创建自定义`Handler`子类:这个子类可能重写了`handleMessage(Message msg)`方法,根据`msg.what`的值执行不同的操作,比如更新UI元素或执行特定...

    Android的Handler使用方法总结

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

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

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

    Android Handler类详解

    Android Handler类详解 Android Handler类详解 Android Handler类详解 Android Handler类详解

    Android Handler传值的demo

    使用`Handler`的`sendMessage(Message msg)`或`sendMessageDelayed(Message msg, long delayMillis)`方法将`Message`发送到消息队列。这些方法会将消息添加到与`Handler`关联的`Looper`的消息队列中。 5. **Looper...

    Android handler message奇怪用法详解

    1. **静态内部类与Handler**:为避免内存泄漏,可以使用静态内部类来创建Handler实例,这样即使外部Activity或Fragment被销毁,Handler也不会持有它们的引用。 2. **弱引用与Handler**:使用WeakReference包裹...

    android handler例子

    在Android开发中,`Handler`是一个至关重要的组件,它用于处理与线程通信相关的任务,尤其是在主线程(UI线程)和工作线程之间。`Handler`、`Looper`和`Message`三者共同构成了Android的消息传递机制。下面将详细...

    Android_Handler详解(一)

    总结起来,Handler是Android中进行线程间通信的重要工具,合理使用它可以有效地提升应用的性能和用户体验。在实际开发中,应结合使用Handler、Looper和Thread,以实现高效的多线程编程。在后续章节,我们将更深入地...

    android handler的一些测试

    在Android开发中,`Handler`、`Looper`和`Message`是实现线程间通信的重要组件,特别是用于主线程(UI线程)与其他工作线程之间的交互。标题“android handler的一些测试”暗示我们将探讨`Handler`如何在多线程环境...

    android handler runnable使用实例(关键是内部run中停止)

    在Android应用开发中,Handler、Runnable和Looper是三个非常重要的组件,它们构成了Android的消息处理机制。这个机制使得UI线程可以非阻塞地处理来自其他线程的消息,从而避免了UI冻结,提升了用户体验。下面我们将...

    Android Handler消息处理顺序分析

    在Android开发中,Handler、Looper和Message是实现线程间通信的重要组件,它们共同构建了Android的消息处理机制。本文将详细分析Android Handler消息处理的顺序,以及如何利用这些组件进行异步操作。 首先,理解...

    android 中Handler 的几种写法

    通过理解以上知识点,开发者可以灵活地在Android应用中使用`Handler`进行线程间通信,高效地处理异步任务和UI更新。在实际开发中,结合`Handler`、`Looper`、`Thread`以及`Runnable`,可以构建出复杂而稳定的多线程...

    Android中handler的使用

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

    老罗android Handler综合练习 图文混排 服务器端源代码

    总结来说,这个压缩包文件提供了一个完整的Android应用开发练习案例,涵盖了Handler的使用、图文混排的实现以及服务器端的JSON、MySQL和JSP技术。对于初学者来说,这是一个很好的实践平台,能够帮助他们深入理解...

    Android中的Handler的具体用法

    本文将深入探讨`Handler`的工作原理、如何使用以及它在Android应用程序中的实际应用。 `Handler`机制是Android系统为了实现线程间通信而设计的一种模式,主要包含三部分:`Handler`、`Message`和`Looper`。`Handler...

    Android Handler模拟进度条更新

    本篇文章将深入探讨如何使用Android Handler来模拟进度条更新。 首先,理解Handler、Looper和Message的基本概念: 1. **Handler**:它是消息处理对象,负责发送和处理Message。在主线程中创建Handler实例后,它...

    Android Handler解析

    # Android Handler解析 在Android应用开发中,保持应用程序的响应性是至关重要的。为了实现这一目标,我们需要确保UI线程不会被阻塞。...掌握Handler的使用,对于提高Android应用的性能和用户体验至关重要。

    Android_Handler消息处理机制

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

Global site tag (gtag.js) - Google Analytics