android handler学习笔记

1、应用程序启动的时候android会开启一个主线程(UI线程管理界面中的UI控件),如果其中有一个耗时操作,界面会出现假死的现象,如果超过5秒中android系统会有一个提示“强制关闭”信息。


2、更新UI只能在主线程中更新,不能在子线程中更新,不然会牵涉到安全性的问题

为了解决上述两个问题,因此就提出了Handler,它运行在主(UI)线程中,它的子线程可以通过Message对象来传递数据,Handler就承担接受子线程传过来的Message对象(子线程用sendMessage()方法传递),把这些信息(里面包含信息)放入主线程队列中,配合主线程的UI更新。

 

handler可以分发Message对象和Runnable对象到主线程中, 每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程),
它有两个作用: (1):  安排消息或Runnable 在某个主线程中某个地方执行, (2)安排一个动作在不同的线程中执行

View Code
public class HandlerTest extends Activity {
HandlerThread handlerThread;
MyHandler handler;
Message msg;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
System.out.println("main thread id :"+Thread.currentThread().getId());
/**
* 生成一个HandlerThread对象,实现了使用Looper来处理消息队列的功能
* 这个类由Android应用程序框架提供
*/
handlerThread = new HandlerThread("handlerThread");
handlerThread.start();
//用Handler(Looper looper)构造方法开启一个新的线程,与主线程不一致
//如果去掉这个参数,则任然和主线程一致
handler = new MyHandler(handlerThread.getLooper());
msg = handler.obtainMessage();
//通过message向子程序传递数据
Bundle b = new Bundle();
b.putInt("id", 110);
b.putString("name", "huangbiao");
msg.setData(b);
/**
* 将Message对象发送到目标对象
* 所谓的目标对象,就是生成该msg对象的handler对象
*/
msg.sendToTarget();
}

class MyHandler extends Handler
{
public MyHandler()
{
}
public MyHandler(Looper looper)
{
super(looper);
}
/*
* 主线程调用下面的方法,另开辟了一个新的线程,我让这个新的线程睡眠1秒中,然后再修改主线程的UI,但是页面提示异常
* 如果不使用睡眠或者不修改主线程的UI,页面不会出现异常
* 想知道为什么休眠和修改主线程的UI有什么关系?
*/
public void handleMessage(Message msg)
{
System.out.println("sub thread is :"+Thread.currentThread().getId());
// try {
// Thread.sleep(1000);
// } catch (InterruptedException e) {
//// TODO Auto-generated catch block
// System.out.println("sleep exception");
// e.printStackTrace();
// }

// for(int i = 0; i < 10000000; i++){
//
// }
//获取主程序传递过来的数据
Bundle bundle = msg.getData();
int id = bundle.getInt("id");
String name = bundle.getString("name");
System.out.println("id is : " + id);
System.out.println("name is : " + name);
if(110 == id){
System.out.println("id == 110");
findViewById(R.id.textView).setVisibility(View.INVISIBLE);
}
}
}
}

 

posted @ 2012-01-10 20:14  胖鹅  阅读(239)  评论(0编辑  收藏  举报