一. Thread泄露
使用Thread 要格外小心,它内存泄露的主要原因是Thread保存着外部类的应用,导致Thread在没有释放的时候会一直抓着外部类的引用不放进而使外部类得不到释放,造成内存泄露。比如下面的例子就会造成Activity在thread运行时得不到释放,极端的例子就是一直 横竖屏切换,很容易就outofmemory了。
- public class ThreadActivity extends Activity {
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- new MyThread().start();
- }
- private class MyThread extends Thread {
- @Override
- public void run() {
- super.run();
- dosomthing();
- }
- }
- private void dosomthing(){
- }
- }
1.把非静态内部类改为静态的内部类,因为静态的内部类(嵌套类 inner activty )可以不依赖与外部类所以它不会持有外部类的引用。
2.如果要用到外部类的东西(比如Context)在线程内部采用弱引用保存Context引用。
- public class ThreadActivity extends Activity {
-
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- new MyThread().start();
- }
- private void dosomthing(){
- }
-
- private static class MyThread extends Thread{
-
WeakReference<ThreadActivity>
mThreadActivityRef
- public MyThread(ThreadAvoidActivity activity){
- mThreadActivityRef = new WeakReference<ThreadAvoidActivity>(activity)
- }
- @Override
- public void run(){
- super.run();
- if (mThreadActivityRef == null) //如果被回收了
- return;
- if(mThreadActivityRef.get() != null) //木有被回收
- mThreadActivityRef.get().dosomthing();
- }
- }
- }