android handler学习笔记

原创 2013年12月04日 09:51:25

 

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学习笔记:关于Handler的详解(二)

4.handler移除消息 5.handler移除消息的内容 6.handler消息通信机制的原理 7.如何实现一个与子线程相关的handler 8. Android中更新ui的几种方式。...
  • u012156341
  • u012156341
  • 2016年02月29日 09:49
  • 564

AppleScript学习笔记(六)处理程序Handler

进入AS4AS书中的最后一章了,本章说的内容类似于OC中的方法和其调用。本文的内容:(1)定义和调用Handler (2)load script...
  • u010962810
  • u010962810
  • 2014年03月01日 10:55
  • 2999

Android学习笔记十二之Android基础UI三

Android学习笔记十二之Android基础UI三
  • solo_talk
  • solo_talk
  • 2016年06月29日 16:47
  • 3652

Android中handler的使用及原理---学习笔记

Android中UI操作是线程不安全的操作,如果有多个线程并发操作UI组件,就会出现线程安全问题,所以Android中制定了一个规则:在Android中只允许主线程(UI线程)修改Activity中的...
  • u013991521
  • u013991521
  • 2015年07月19日 10:33
  • 4298

Netty4.0学习笔记系列之四:混合使用coder和handler

Handler如何使用在前面的例子中已经有了示范,那么同样是扩展自ChannelHandler的Encoder和Decoder,与Handler混合后又是如何使用的?本文将通过一个实际的小例子来展示它...
  • u013252773
  • u013252773
  • 2014年03月19日 23:53
  • 11065

完整学习笔记之Android基础(详版)

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和...
  • Liliqianbaidu
  • Liliqianbaidu
  • 2017年04月27日 14:48
  • 632

Android Handler正确使用姿势

Android Handler正确使用姿势
  • geanwen
  • geanwen
  • 2017年01月08日 15:14
  • 1082

Android学习笔记之Handler

今天在学习Android时遇到了Handler。在Android的多线程操作时不要阻塞ui线程,不要在ui线程外访问Android UI包...
  • qq_33782468
  • qq_33782468
  • 2016年07月25日 19:24
  • 140

Android之学习安卓每天成长笔记

8月7日 1 、安装了反编译工具 jad  net.sf.jadclipse_3.3.0.jar 或者在help install software http://feeling.sourceforge...
  • u011068702
  • u011068702
  • 2015年08月19日 11:26
  • 1133

android学习笔记——Handler

1、handler是一套消息处理机制(Activity的生命周期中状态的变化就是通过handler发送消息)和更新UI的机制(不能在非UI线程中跟新UI) 2、创建Handler时,所创建的Handl...
  • CQU_LiuHC
  • CQU_LiuHC
  • 2016年04月03日 19:16
  • 268
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android handler学习笔记
举报原因:
原因补充:

(最多只允许输入30个字)