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();
}
}
};
}


下图是执行的结果:

[img]http://dl.iteye.com/upload/attachment/360299/130d750e-2dc0-3bc2-b05f-491ebac36875.jpg[/img]

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

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

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


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


输出结果:

[img]http://dl.iteye.com/upload/attachment/360306/a3b1b57e-520a-3ee9-9813-5d22ddd2b3ef.jpg[/img]

从这个输出结果中可以看出,这次线程对象的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中存储的值。
看一下输出结果:

[img]http://dl.iteye.com/upload/attachment/360302/b055adac-f270-3509-95ba-ecb256b3d013.jpg[/img]

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


项目已经打包上传到附件了,有需要的可以下载。
注:示例1和示例2是在同一个应用程序中,当运行程序的时候默认的是启动示例1的Activity,如果要运行示例2的Activity,那么就将应用程序中的AndroidManifest.xml文件里的Activity标签的name修改成HandlerTest2就OK了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值