background image

3

}  

以上的代码是很危险的,如果将 Activity 赋值到么 mContext 的话。那么即使该 Activity 已

经 onDestroy,但是由于仍有对象保存它的引用,因此该 Activity 依然不会被释放. 

 

如何才能有效的避免这种引用的发生呢?

第一,应该尽量避免 static 成员变量引用资源耗费过多的实例,比如 Context  

第二、Context 尽量使用 Application Context,因为 Application 的 Context 的生命周期比较长,

 

引用它不会出现内存泄露的问题。

第三、使用 WeakReference 代替强引用。比如可以使用 WeakReference mContextRef; 

2.

 

线程惹的祸

线程也是造成内存泄露的一个重要的源头。线程产生内存泄露的主要原因在于线程生命周

期的不可控。我们来考虑下面一段代码。

4

public class MyActivity extends Activity {      

5

@Override      

6

public void onCreate(Bundle savedInstanceState) {          

7

  super.onCreate(savedInstanceState);          

8

  setContentView(R.layout.main);          

9

  new MyThread().start();      

10 }        

11 private class MyThread extends Thread{          

12 @Override          

13

  public void run() {              

14

  super.run();              

15

  //do somthing          

16 }      

17 }  

18 }    

这段代码很平常也很简单,是我们经常使用的形式。我们思考一个问题:假设 MyThread

的 run

 

函数是一个很费时的操作,当我们开启该线程后,将设备的横 屏变为了竖屏,一

般情况下当屏幕转换时会重新创建 Activity,按照我们的想法,老的 Activity 应该会被销

 

毁才对,然而事实上并非如此。

                     找软件资料,就到一览软件文库

http://wk.yl1001.com/rj/