Android回调方法:什么时候?怎么样?来自wheech Thread?

时间:2016-05-29 16:40:37

标签: android multithreading callback

我不了解/了解有关Android回调方法及其实现的内容。

我有一个简单的Activity,其实现的回调如:

@Override
onResume() {
    Log.i(TAG, "onPause()");
}

@Override
onDestroy() {
    Log.i(TAG, "onDestroy()");
}

onButtonPressed() {
    while(true) {
        Log.i(TAG, "onButtonPressed()");
        SystemClock.sleep(1000);
    }
}

当我启动应用程序并更改屏幕方向时,我可以在控制台中看到onPause()和onDestroy()日志。 但是,当我按下测试按钮(onButtonPressed())并启动一个持久的过程(同时为true)时,我只能在控制台中看到onButtonPressed()日志。我可以旋转手机,我看到根据方向调整了活动,但是没有调用onDestroy()和onPause()(在控制台中没有日志)回调。

我的活动在定位更改期间是否仍会重新创建?为什么不调用回调?他们是否被其他线程召唤?

任何人都可以向我澄清这种情况并解释Android究竟是如何执行回调方法的调用的吗?

在AndroidN上测试。

谢谢。

更新 看起来这是我身边的错误。 当我旋转手机时,我看到屏幕正在旋转,但还没有意识到活动不是......它只是放在屏幕的一侧(寻找它是Android N上的开发者预览错误)。那让我很困惑:D

enter image description here

感谢您的回答和帮助。

1 个答案:

答案 0 :(得分:3)

除非在文档中另有说明,否则所有方法调用和回调通常都在主线程(UI线程)上处理。

这适用于所有生命周期方法,例如示例中的onResume()onDestroy()以及onButtonPressed()等用户界面回调。

在第二个进入无限while循环的示例中,您完全占用UI线程,因此任何生命周期方法都不能再运行,用户也无法再与应用程序交互。这就是为什么当您旋转设备时,您看不到正在打印的日志语句。当前Activity永远不会被销毁,并且无法创建新的Activity,因为您有一个负责在无限循环中执行此操作的线程。

这也是Android文档建议将所有长时间运行的操作从UI线程移出的原因,这样您就不会对用户的体验产生负面影响。