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