这是我在学习android中线程时遇到的问题。当我在一个activity中创建一个线程,这个线程使用while(true)无限执行输出操作,如下:
new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub while (true) { try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } handler.sendEmptyMessage(1); } } }).start(); Log.i("",id+"" ); break;
handler代码
Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub switch (msg.what) { case 1: Log.i("",id+"" ); id++; break; default: break; } }};
当我调用finish指令之后,查看Logcat,依旧可以看到id仍在输出。
在查看网上的生命周期讲解时,都说在执行onDestroy时会释放掉activity所占用的资源。那么理论山过来说这个handler对象和ID对象也该被释放才对啊,为什么会这样呢。同时,当我试图在hangdler中使用MainActivity.this.isDestroyed()时会报异常,该对象已经被destroy。
个人推测1:destroy之后,这个activity仍旧存在于内存中,只是activity本身的一些方法和属性不可使用,但是在它内部定义的其他对象却能使用。
2:在activity内定义的对象跟activity根本不是存放在一个地方的,不像C#类内部定义的字段,对象之类的,会和该类实例化对象放在一起。
还是说其他情况?
刚仔细看了一下android的GC机制,我的第一个想法应该是对的。在destroy之后系统并未回收掉该activity的内存,而且恰恰,不被回收的原因就是我的线程引用了改activity内的handler。