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