关于 Thread 里创建对象的问题

2020-12-27 14:22:47 +08:00
 QBugHunter

有这样一个对象

class CustomObject{
    private DeviceInfo deviceInfo;  //这个 DeviceInfo 是一个自定义对象
    public CustomObject(){
        deviceInfo = new DeviceInfo();
    }
};

class PrintDevice{
    private static CustomObject customObj;  //静态对象,会在子线程中创建
    public PrintDevice(){
    Thread MyThread = new Thread() {
            public void run() {
                customObj =  new CustomObject();
            }
        };
        MyThread.start();
    }
};

对于这种情况下,CustomObject 会在一个 Thread 里生成,假如 APP 被强杀,或者关闭,那 CustomObject 的类成员 DeviceInfo,在 APP 再次启动时任然保留着内存中的机率有多大?能否保证 DeviceInfo 对象肯定会在 APP 消失时一起消失?

9426 次点击
所在节点    Android
9 条回复
aijam
2020-12-27 14:34:13 +08:00
> 能否保证 DeviceInfo 对象肯定会在 APP 消失时一起消失?
sm1314
2020-12-27 14:35:24 +08:00
APP 被强杀 所有线程都 gg 了
QBugHunter
2020-12-27 15:01:01 +08:00
@aijam

@sm1314

那假如这个线程是在某个 Activity 上启动的,这个 Activity 被杀了,但 APP 还在,那 deviceInfo 是否还有可能在内存中?
aijam
2020-12-27 15:15:19 +08:00
ChenFanlin
2020-12-27 16:00:00 +08:00
只要 application 重新启动了 就是新的**进程**, 老的对象自然就是没了
crclz
2020-12-27 16:14:14 +08:00
进程是由操作系统管理。
你的进程不管是优雅地退出,还是暴力地退出,
你这个进程的所有(操作系统分配的)资源都会优雅地释放。
zzy619
2020-12-27 17:48:23 +08:00
首先,理解一下进程、线程的概念,其次 customObj 是 static 的,和 Activity 被杀也没关系
nthhdy
2020-12-27 20:02:19 +08:00
@QBugHunter 对象都是 java 的虚拟机管理的。虚拟机退出时会释放资源,这个对象(无论哪个线程)就没了,和 Activity 没有直接关系。
我理解 Activity 不存在“杀掉”,只有响应各种事件,在不同的状态之间切换。如果安卓系统发现这个 Activity 已经不再使用了,可能会把它回收掉,接下来有可能导致 app 退出(比如 app 只有这唯一一个 Activity 时),然后 java 虚拟机退出、释放资源,这时你所有对象就都没了。Activity 也有可能又从后台重新成为用户焦点,此时 app 是一直在的,java 虚拟机没有退出,对象就一直在内在中保留着。
zhgg0
2020-12-27 20:32:20 +08:00
如果 customObj 在,deviceInfo 就在。customObj 在不在跟创建它的 Thread 无关。由于 customObj 是 static 的,application 不重建,customObj 就在,application 重建了,customObj 就没了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/739372

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX