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
想对作者说点什么? 我来说一句

Android Handler

2011年08月14日 415KB 下载

Android Handler类详解

2011年08月14日 211KB 下载

android学习笔记

2011年06月20日 131KB 下载

android handler理解

2012年03月30日 207KB 下载

Android Handler传值的demo

2015年09月22日 629KB 下载

Android学习笔记

2011年09月08日 1007KB 下载

android 学习笔记doc

2011年11月12日 118KB 下载

没有更多推荐了,返回首页

不良信息举报

android handler学习笔记

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭