V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
QBugHunter
V2EX  ›  Android

关于 Thread 里创建对象的问题

  •  
  •   QBugHunter · 2020-12-27 14:22:47 +08:00 · 4708 次点击
    这是一个创建于 1210 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有这样一个对象

    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 消失时一起消失?

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

    @sm1314

    那假如这个线程是在某个 Activity 上启动的,这个 Activity 被杀了,但 APP 还在,那 deviceInfo 是否还有可能在内存中?
    aijam
        4
    aijam  
       2020-12-27 15:15:19 +08:00
    ChenFanlin
        5
    ChenFanlin  
       2020-12-27 16:00:00 +08:00
    只要 application 重新启动了 就是新的**进程**, 老的对象自然就是没了
    crclz
        6
    crclz  
       2020-12-27 16:14:14 +08:00
    进程是由操作系统管理。
    你的进程不管是优雅地退出,还是暴力地退出,
    你这个进程的所有(操作系统分配的)资源都会优雅地释放。
    zzy619
        7
    zzy619  
       2020-12-27 17:48:23 +08:00
    首先,理解一下进程、线程的概念,其次 customObj 是 static 的,和 Activity 被杀也没关系
    nthhdy
        8
    nthhdy  
       2020-12-27 20:02:19 +08:00
    @QBugHunter 对象都是 java 的虚拟机管理的。虚拟机退出时会释放资源,这个对象(无论哪个线程)就没了,和 Activity 没有直接关系。
    我理解 Activity 不存在“杀掉”,只有响应各种事件,在不同的状态之间切换。如果安卓系统发现这个 Activity 已经不再使用了,可能会把它回收掉,接下来有可能导致 app 退出(比如 app 只有这唯一一个 Activity 时),然后 java 虚拟机退出、释放资源,这时你所有对象就都没了。Activity 也有可能又从后台重新成为用户焦点,此时 app 是一直在的,java 虚拟机没有退出,对象就一直在内在中保留着。
    zhgg0
        9
    zhgg0  
       2020-12-27 20:32:20 +08:00
    如果 customObj 在,deviceInfo 就在。customObj 在不在跟创建它的 Thread 无关。由于 customObj 是 static 的,application 不重建,customObj 就在,application 重建了,customObj 就没了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2919 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 13:34 · PVG 21:34 · LAX 06:34 · JFK 09:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.