用HandlerThread创建一个启动线程

在Android编程里,可以之间用Handler调用一个Ruannable对象中的run()方法,此时只有一个主线程main,并没有因为执行run()方法而多产生了线程。所以这种做法很多时候,不能很好的满足用户需求。比如:当用户在下载一个较大的文件时候,需要较长的时间在下载,下载过程中这个Activity就操作不了。这是就需要另外开启一个单独的线程,创建一个单独的线程有很多中方法。我下午是用的HandlerThread来创建的。写完代码后运行,程序出错,Null Point Exception。找找找,测测测。没有找出来(菜鸟,不怎么会调试)。最后,查了HandlerThread的API文档。下面这要写的,注意红字部分。Note that start() must still be called.一定要用Start方法启动线程,手贱,以前Java里面怎么启动线程的啊。可能是把他和handler搞混了。


/**
 * Handy class for starting a new thread that has a looper. The looper can then be 
 * used to create handler classes. Note that start() must still be called.
 */

HandlerDemo2.java 

package com.handler;

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

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		System.out.println("Activity--->"+Thread.currentThread().getName());
		
		//创建一个HandlerThread对象,线程名字为“Handler Thread”
// Handy class for starting a new thread that has a looper. The looper can then be 
// used to create handler classes. Note that start() must still be called.
		HandlerThread handlerThread = new HandlerThread("Handler Thread");
			handlerThread.start();
		//创建一个Handler对象,并从HandlerThread中获取Looper对象
		MyHandler handler = new MyHandler(handlerThread.getLooper());
		//在Handler对象里面取Android系统提供的Message对象。
		Message msg = handler.obtainMessage();
		System.out.println(Thread.currentThread().getName());
		Bundle bundle = new Bundle();
		bundle.putInt("age",20);
		bundle.putString("name", "Jason");
		//将以个Bundle对象放入Message对象里,Message可以用Bundle来传递大量的数据
		msg.setData(bundle);
		//讲message发送给指定目标,这个目标也就是创建这个message对象的  那个对象
		msg.sendToTarget();
		
	}
	
	class MyHandler extends Handler{
		public MyHandler(Looper looper){
			super(looper);
		}

		@Override
		public void handleMessage(Message msg) {
			// TODO Auto-generated method stub
			System.out.println(Thread.currentThread().getName()+":"
					+Thread.currentThread().getId());
			
			//读取message中的数据
			Bundle bundle =msg.getData();
			int age = bundle.getInt("age");
			String name = bundle.getString("name");
			System.out.println("age is:"+age+",name is "+name);
			
		}
	}
	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值