匿名内部类/风静态内部类和异步线程
- 风静态内部类创建静态实例造成的内存泄漏
我们都知道风静态内部类是默认持有外部类的引用的,如不雅在内部类中定义单例实例,会导致外部类无法释放。如下面代码:
由法度榜样分派内存,GC来释放内存。内存释放的道理为该对象或者数组不再被引用,则JVM会在恰当的时刻收受接收内存。
当TestActivity烧毁时,因为innerClass生命周期等同于应用生命周期,然则它又持有TestActivity的引用,是以导致内存泄漏。
精确做法应将该内部类设为静态内部类或将该内部类采掏出来封装成一个单例,如不雅须要应用Context,请按照膳绫擎推荐的应用Application 的 Context。当然,Application 的 context 不是全能的,所以也不克不及随便乱花,对于有些处所则必须应用 Activity 的 Context,对于Application,Service,Activity三者的Context的应用处景如下:
- 匿名内部类
android开辟经常会持续实现Activity/Fragment/View,此时如不雅你应用了匿名类,并被异步线程持有了,那要当心了,如不雅没有任何办法如许必定会导致泄漏。如下代码:
膳绫擎的runnable所引用的匿名内部类持有TestActivity的引用,当将其传入异步线程中,线程与Activity生命周期不一致就会导致内存泄漏。
- Handler造成的内存泄漏
Handler造成内存泄漏的根来源基本因是因为,Handler的生命周期与Activity或者View的生命周期不一致。Handler属于TLS(Thread Local Storage)生命周期同应用周期一样。看下面的代码:
- public class TestActivity extends AppCompatActivity {
- private Handler mHandler = new Handler() {
- @Override
- public void dispatchMessage(Message msg) {
- super.dispatchMessage(msg);
- }
- };
- @Override
- protected void onCreate(@Nullable Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- mHandler.postDelayed(new Runnable() {
- @Override
- public void run() {
- //do your things
- }
- }, 60 * 1000 * 10);
- finish();
- }
推荐阅读
此次的成功融资让金山云的用户也跟着受益,因为金山云的主流产品将周全降价,个中CDN、云数据库Redis新价动人,降幅最大年夜可达到50%、60%;云办事器价格最大年夜降幅跨越30%;对象存储产品>>>详细阅读
本文标题:Android面试被问到内存泄漏了杂整?
地址:http://www.17bianji.com/lsqh/39898.html
1/2 1