标签:
网上查看了好多关于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(); } } } }
标签:
原文地址:http://www.cnblogs.com/bokeofzp/p/4787678.html