android handler学习笔记

 

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


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

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

 

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

 

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

 

你可能感兴趣的:(android)