关于Android中使用Thread造成内存泄露的疑问

ShouCeng 2017-12-12 04:19:13
一下代码片段会产生内存泄露:
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(){

}
}

网上一直分析的是:假设MyThread的run函数是一个很费时的操作,当我们开启该线程后,将设备的横屏变为了竖屏,
一般情况下当屏幕转换时会重新创建Activity,按照我们的想法,老的Activity应该会被销毁才对,然而事实上并非如此。
由于我们的线程是Activity的内部类,所以MyThread中保存了Activity的一个引用,当MyThread的run函数没有结束时,
MyThread是不会被销毁的,因此它所引用的老的Activity也不会被销毁,因此就出现了内存泄露的问题。
这种线程导致的内存泄露问题应该如何解决呢?

将线程的内部类,改为静态内部类。
在线程内部采用弱引用保存Context引用。

有个疑惑:
在切换屏幕的时候,虽然创建新的Activity,老的Activity可能会因为MyThread还没结束而继续存在,那么在后台继续执行的MyThread为什么就会导致内存泄露呢,MyThread在执行完后JVM应该就开始回收MyThread,然后旧的Activity,不是吗?
...全文
399 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
只为搞笑 2017-12-15
  • 打赏
  • 举报
回复
得先明白内存泄漏后的结果是什么,是OOM。让一个不确定时间的线程长时间持有一个界面,会在这个线程的生命周期里增加额外的内存开销。如果是多个呢?比如用户需要反复打开关闭这个界面呢?如果这个界面有许多控件、图片呢? 可能结果就是OOM了。所以让GC能够及时回收无效内存是很有必要的。
江三木洛 2017-12-14
  • 打赏
  • 举报
回复
引用 3 楼 dsc114 的回复:
[quote=引用 2 楼 xw13782513621 的回复:] 内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。 因为老的Activity在切换屏幕之后应该就是没用的,应该被回收,但是由于MyThread还在跑,导致老的Activity被引用,不能被回收,但是很明显,老的Activity是没用的,会造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
那如果MyThread运行结束了呢?[/quote] 那就可以回收老的Activity啊 内存泄露描述的时候大部分都是某某种情况在什么条件下可能会造成内存泄露 你的MyThread如果跑的快,先结束了,内存也泄露不了啊。但是又不能保证跑得快,而且后续开发中也保证不了在MyThread中不添加新的逻辑吧,所以还是要做点预防措施的
江三木洛 2017-12-13
  • 打赏
  • 举报
回复
内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。 因为老的Activity在切换屏幕之后应该就是没用的,应该被回收,但是由于MyThread还在跑,导致老的Activity被引用,不能被回收,但是很明显,老的Activity是没用的,会造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
ShouCeng 2017-12-13
  • 打赏
  • 举报
回复
引用 2 楼 xw13782513621 的回复:
内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。 因为老的Activity在切换屏幕之后应该就是没用的,应该被回收,但是由于MyThread还在跑,导致老的Activity被引用,不能被回收,但是很明显,老的Activity是没用的,会造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
那如果MyThread运行结束了呢?
  • 打赏
  • 举报
回复
实现一下onConfigurationChanged 让切换屏幕的时候不重新onCreate

80,348

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧