Android Activity 销毁后子线程会不会被GC回收
曾想当然地认为页面被finish之后线程会被android 虚拟机的垃圾回收机制回收掉。
于是用页面跳转做测试
测试代码
结果有点意外,页面被销毁后定时器依然在执行。退出应用定时器还在执行。
UI线程被结束掉,UI线程里面的子线程并没有被GC
问题来了,应该如何主动销毁呢
1、通过线程
Hanlder是线程与Activity通信的桥梁,利用handler接收到任务线程,放到任务队列里面派对执行。//调用该任务线程的run() 方法执行任务线程。Handler updateBarHandler =new handler();handler.post(Runnable Thread);//移除handler里的任务线程,调用线程的stop()方法,销毁线程。handler.removecallbacks(Runnable Thread);
2、通过Timer
通过以下四种方法终止一个timer线程:
a)调用timer的cancle方法。可以从程序的任何地方调用此方法,甚至在一个timer task的run方法里;
b)让timer线程成为一个daemon线程(可以在创建timer时使用new Timer(true)达到这个目地),这样当程序只有daemon线程的时候,它就会自动终止运行;
c)当timer相关的所有task执行完毕以后,删除所有此timer对象的引用(置成null),这样timer线程也会终止;
d)调用System.exit方法,使整个程序(所有线程)终止。 Android基于Linux内核开发,其进程调度相关方面和Linux保持一致。主进程销毁后,其中的线程会被内核执行销毁流程,并回收资源,但是子进程并不会。因为线程使用的是主进程进程空间,进程空间销毁意味着线程随之销毁;子进程拥有独立进程空间,如果销毁父进程,子进程会被初始进程接管成为继父进程。
发表评论