Handler的使用(二)

转载自:http://www.eoeandroid.com/thread-72299-1-1.html

 一、 Handler与线程的关系

       Handler在默认情况下,实际上它和调用它的Activity是处于同一个线程的。
例如在Handler的使用(一)的示例1中,虽然声明了线程对象,但是在实际调用当中它并没有调用线程的start()方法,而是直接调用当前线程的run()方法。

       通过一个例子来证实一下

       示例1:一个Android应用程序,在Activity中创建Handler和线程对象,并且在Activity的onCreate()方法中输出当前线程的id和名字,然后在线程对象的run方法中也打印输出下当前线程的id和名字。如果说,Activity输出的结果与线程对象输出的结果是一样的,那么就表示它们使用的是同一个线程。
下面是Activity代码:

package com.test;

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

public class HandlerTest extends Activity {
	/** Called when the activity is first created. */
	Handler handler = new Handler();
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		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() {

		@Override
		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了

Java代码:

//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里的内容。 


其实android还给我们提供了HandlerThread这个类,开启新的线程

具体java代码如下:

package com.test;

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 HandlerTest2 extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		System.out.println("activity id--->" + Thread.currentThread().getId());
		System.out.println("activity name--->"
				+ Thread.currentThread().getName());

		HandlerThread handlerThread = new HandlerThread("handler_thread");
		handlerThread.start();
		MyHandler handler = new MyHandler(handlerThread.getLooper());
		Message msg = handler.obtainMessage();
		msg.sendToTarget();
	}

	class MyHandler extends Handler {
		public MyHandler() {
		}

		public MyHandler(Looper looper) {
			super(looper);
		}

		@Override
		public void handleMessage(Message msg)
		{
			super.handleMessage(msg);
			System.out.println("handler id--->"
					+ Thread.currentThread().getId());

			System.out.println("handler name--->"
					+ Thread.currentThread().getName());
		};
		
	}
}

结果如下图:


 
我们发现在新的线程中启动了这个Handler。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值