zoukankan      html  css  js  c++  java
  • 线程、消息Android入门开发系列学习之 Handler使用by小雨

    发一下牢骚和主题无关:

            Android供给了一个步异的消息调回机制Handler,  它责负发送消息和处置线程消息列队中的消息及runnable对象 

           Handler例实都是与一个线程和该线程的消息列队起一应用,一旦建创了一个新的handler例实,系统就把该例实与一个线程和该线程的消息列队捆绑起来,这将可以发送消息和runnable对象给该消息列队,并在消息列队出口处处置它们。

             Handler认默应用前当的线程RunLoop,  但是也可以通过它的构造函数来指定某个线程的runloop, 或者应用专用的HandlerThread。

            必须要注意的是, 应用Handler的线程中,必须实现了Runloop消息循环,否则会发生行运异常。 

            通常情况下,如果我们在主线程应用Handler, 则不须要我们动主去建创runloop, 因为android系统为动主为activity主线程建创一个runloop。 

            一样我们可以在一个殊特的子线程中应用Handler,而不必去建创runloop。这个殊特子线程就是HandlerThread, 查看其码源,我们可以发明,它也在run方法中实现了runloop。

         

        

          上面就分析Handler的几种应用场景和用法:

         1. 在主线程中应用Handler

              主线程中应用Handler对相简略, 上面的示例代码实现了在主线程中建创Handler对象,动启一个runable方法去刷新进度条。代码如下:

        

    //在主线程中建创一个Handler对象
    Handler  handler = new Handler()
    					{
    						public void handleMessage(Message msg)
    						{
    							firBar.setProgress(msg.arg1);
    							handler.post(updateThread);
    							
    							Log.v("thread----", Thread.currentThread().getName());
    						}
    					};
    handler.post(updateThread);

        //去行运

    //建创一个runable去刷新进度条
    Runnable updateThread = new Runnable() {
    		
    		@Override
    		public void run() {
    			// TODO Auto-generated method stub
    			if ( i>= 100) {
    				handler.removeCallbacks(updateThread);
    				return;
    			}
    				
    
    			
    			i += 10;
    			
    			Message msg = handler.obtainMessage();
    			msg.arg1 = i;
    			
    			try {
    				Thread.sleep(1000);    //线程暂停1s
    			} catch (InterruptedException e) {
    				// TODO: handle exception
    				e.printStackTrace();
    			}
    			
    			handler.sendMessage(msg);
    			handler1.sendEmptyMessage(0);
    			
    		}
    	};

        2.  在通普的子线程中应用Handler

             示例代码如下:

        

    //建创一个子线程,在其中应用Handler
    	class MyThread extends Thread
    	{
    		
    			public void run() {
    				Looper.prepare();
    				 handler1 = new Handler()//Looper.getMainLooper()
    				{
    				    public void handleMessage(Message msg)
    				    {
    				    	Log.v("SubThread",Thread.currentThread().getName());
    				    	
    				    	// 这里执行耗时作操,不会影响到UI主线程
    				    	for (int i = 0; i < 1000000000; i++) {
    							
    						}
    				    }
    					
    				};
    				
    				Looper.loop();
    			}
    	
    	}

        3.  在HandlerThread线程中应用Handler

             

    HandlerThread handlerThread = new HandlerThread("handlerThread");
    				handlerThread.start();
    				
    				//这里获取到HandlerThread的runloop
    				MyHandler myHandler = new MyHandler(handlerThread.getLooper());

        

    文章结束给大家分享下程序员的一些笑话语录: 《诺基亚投资手机浏览器UCWEB,资金不详或控股》杯具了,好不容易养大的闺女嫁外国。(心疼是你养的吗?中国创业型公司创业初期哪个从国有银行贷到过钱?)

  • 相关阅读:
    C# Nest客户端查询es字段为空的语句
    Nuget 包还原成功,但引用异常
    ES7.2 安装问题
    elasticsearch 子节点有Unassigned Shards处理方法 和 failed to obtain in-memory shard lock
    rabbitmq修改日志级别
    C# NEST terms
    ES create index template
    Servicestack + Exceptionless本地部署
    live-server的使用
    处理cnpm控制台运行无反应(干瞪眼 就是不动)
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3023901.html
Copyright © 2011-2022 走看看