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

  

原文地址:https://www.cnblogs.com/bokeofzp/p/4787678.html