首页新闻找找看学习计划

再问Android的activity的生命周期问题

0
悬赏园豆:10 [已关闭问题] 关闭于 2013-10-25 15:30

这是我在学习android中线程时遇到的问题。当我在一个activity中创建一个线程,这个线程使用while(true)无限执行输出操作,如下:

new Thread(new Runnable() {
                
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    while (true) {
                        
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        handler.sendEmptyMessage(1);
                    }
                }
            }).start();
            Log.i("",id+"" );
            break;

handler代码

Handler handler=new Handler(){

        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            switch (msg.what) {
            case 1:
                Log.i("",id+"" );
                id++;
                break;

            default:
                break;
            }
        }};

当我调用finish指令之后,查看Logcat,依旧可以看到id仍在输出。

在查看网上的生命周期讲解时,都说在执行onDestroy时会释放掉activity所占用的资源。那么理论山过来说这个handler对象和ID对象也该被释放才对啊,为什么会这样呢。同时,当我试图在hangdler中使用MainActivity.this.isDestroyed()时会报异常,该对象已经被destroy。

个人推测1:destroy之后,这个activity仍旧存在于内存中,只是activity本身的一些方法和属性不可使用,但是在它内部定义的其他对象却能使用。

2:在activity内定义的对象跟activity根本不是存放在一个地方的,不像C#类内部定义的字段,对象之类的,会和该类实例化对象放在一起。

还是说其他情况?

问题补充:

刚仔细看了一下android的GC机制,我的第一个想法应该是对的。在destroy之后系统并未回收掉该activity的内存,而且恰恰,不被回收的原因就是我的线程引用了改activity内的handler。

林J的主页 林J | 菜鸟二级 | 园豆:202
提问于:2013-10-10 11:50
< >
分享
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册