
Handler与Thread
启动“线程”
handler.post(manaThread);
结束“线程”
handler.removeCallbacks(manaThread);
创建线程并重写消息处理方法
Handlerhandler = new Handler(){
@Override
publicvoid handleMessage(Message ms){
//这里可以获取ms的属性,用ms...
启动“线程”
handler.post(manaThread);
结束“线程”
handler.removeCallbacks(manaThread);
创建线程并重写消息处理方法
Handlerhandler = new Handler(){
@Override
publicvoid handleMessage(Message ms){
//这里可以获取ms的属性,用ms.arg1和ms.arg2
intpre=ms.arg1;
//线程如果睡眠,则需再次放进线程队列
handler.post(manaThread);
}
}
RunnablemanaThread = new Runnable(){
@Override
publicvoid run(){
//定制要发送的消息
Messagems=handler.obtainMessage();
ms.arg1=1;
//如果是定是操做,则线程需要睡眠
Thread.sleep(2000);
//发送消息
handler.sendMessage(ms);
}
}
OK如果你按我的写法做过实验,你会发现:当线程睡眠时,Acitvity不能接收请求了,就是WIN中的”程序无法响应”(不信?你把睡眠时间改长一点)
那么,这是怎么回事呢?
so...let us analyze it...
没错!就是你想的那样,handler现在是依附在主线程上面的,也就是说,并没有实现我们想要的多线程效果。
下面,让我们来实现一个比较接近点的多线程吧
classStartOnClick implementsOnClickListener{
public void onClick(View v) {
HandlerThreadhandlerThread=newHandlerThread("ht");
handlerThread.start();
NewHandlernewHandler=newNewHandler(handlerThread.getLooper());
Messagems=newHandler.obtainMessage();
ms.arg1=1;
ms.sendToTarget();
}};
classNewHandler extendsHandler{
public New Handler(Looper looper) {
super(looper);
}
@Override
publicvoidhandleMessage(Message msg) {
Log.i("线程信息接收成功",msg.arg1+"");
}
}
classEndBtnOnClick implementsOnClickListener {
@Override
publicvoidonClick(View v) {
handlerThread.interrupt();
Log.i("线程状态","线程已释放");
}
}
不过,你应该发现了一个问题,在子线程里面不能更新UI,因为那是主线程的
所以,下面,我以一个实例来表达我的理解:
private int count=0;
private HandlerThread handlerThread;
//点击事件启动
class StartOnClick implements OnClickListener{
@Override
public void onClick(View v) {
handlerThread=new HandlerThread("ht");
handlerThread.start();
NewHandler newHandler=new NewHandler(handlerThread.getLooper());
Messagems=newHandler.obtainMessage();
ms.arg1=++count;
ms.sendToTarget();
}
}
//子线程处理代码
class NewHandler extends Handler{
public NewHandler(Looper looper) {
super(looper);
}
@Override
//执行完想要的操作,就交给handler去处理UI了
public void handleMessage(Message msg) {
Log.i("子线程消息接收成功",msg.arg1+"");
if(msg.arg1==5){
handler.post(manaThread);
}
}
}
//handler处理代码
Runnable manaThread=new Runnable() {
@Override
//附加到主线程并发送消息
public void run() {
Message ms=handler.obtainMessage();
ms.arg1=count;
handler.sendMessage(ms);
}
};
//取出消息,更新UI
Handler handler=new Handler(){
public void handleMessage(Message msg) {
txtShow.setText(msg.arg1+"");
Log.i("主线程接收成功!",msg.arg1+"");
}
};
//释放子线程
class EndBtnOnClick implementsOnClickListener {
@Override
public void onClick(View v) {
handlerThread.interrupt();
Log.i("子线程状态:","线程释放结束");
}
}
OK就是这些了,希望你可以与我交流经验