zoukankan      html  css  js  c++  java
  • Looper学习

    网上查看了好多关于looper,

    1.每个线程有且最多只能有一个Looper对象,它是一个ThreadLocal

    2.Looper内部有一个消息队列,loop()方法调用后线程开始不断从队列中取出消息执行,若没有消息就处于阻塞状态,android的主线程就是一个looper线程。

    3.Looper使一个线程变成Looper线程。

    简单的说,当程序调用Looper.prepare()后在中间可以初始化handler,一个looper线程可以有多个handler。当一个线程是looper线程时候,looper有一个消息队列,不停的读消息队列的消息然后执行,如果没有就处于阻塞状态,等有消息了就继续读消息然后执行。handler是处理looper中消息队列消息的。

    我自己总结并认为比较容易明白的描述是:
    在程序消息队列中排队的消息保持了对目标Handler类的应用。如果Handler是个内部类,那么它也会保持它所在的外部类(通常是Activity或者Service等)的引用。那么这时只要有消息在队列中,那么Handler便无法被回收,如果Handler不是static那么使用Handler的Service和Activity就也无法被回收,这就可能导致内存泄露。那么什么情况下会发生泄漏?通常只有在你发送了一个延时很长的消息的时候才可能会发生。

    public class MainActivity extends Activity {
    
    	private  Handler handler;
    	private boolean flag=true;
        @Override
        protected void onCreate (Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            Thread lo=new Mythread();
            lo.start();
            while(true)
            {
            	if(!flag){
            	Message msg=new Message();
            	msg.what=3;
            	try {
    				Thread.sleep(2000);
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
            	handler.sendEmptyMessageDelayed(msg.what, 2000);
            }
            }
          
            
            }
    
        class Mythread extends Thread
        {
    		@Override
    		public void run() {
    			{
    				
    				Looper.prepare();
    				handler=new Handler(){
    					@Override
    					public void handleMessage(Message msg) {
    						int c=msg.what;
    						System.out.println(c);
    						super.handleMessage(msg);
    					}
    					};
    				flag=false;
    				Looper.loop();
    			
    			}
    		}
        }
    }
    

      

  • 相关阅读:
    SpringBoot多数据源:动态数据源
    cron 表达式
    6种@Transactional注解的失效场景
    spring boot 整合mybatis 的xml版本
    MySQL函数大全 及用法示例
    后端必备 Nginx 配置
    详解SpringBoot应用跨域访问解决方案
    Lombok使用
    前端必备 Nginx 配置
    随便写写插入排序
  • 原文地址:https://www.cnblogs.com/bokeofzp/p/4787678.html
Copyright © 2011-2022 走看看