我目前正在开发一个带有网络请求的应用程序。然而,尽管我请求过一次,但还是得到了两个结果。(与logcat核对(之后,我开始研究Android生命周期,并将日志添加到生命周期函数的ALL中:
Ex(onResume()
override fun onResume() {
Log.d("LIFECYCLE", "OnResume Started")
super.onResume()
Log.d("LIFECYCLE", "OnResume Ended")
}
打印logcat后,我得到了这样的结果:
1. D/LIFECYCLE: OnCreate Started
2. W/<appname>: Accessing hidden method Landroid/view/View;->computeFitSystemWindows(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z (unsupported, reflection, allowed)
3. W/<appname>: Accessing hidden method Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V (unsupported, reflection, allowed)
4. D/LIFECYCLE: OnCreate Ended
5. D/THREAD: Thread Started -> The network request thread
6. W/<appname>: Accessing hidden method Ljava/lang/invoke/MethodHandles$Lookup;-><init>(Ljava/lang/Class;I)V (unsupported, reflection, allowed)
7. D/LIFECYCLE: OnStart Started
8. I/ActivityThread: Schedule relaunch activity: <PACKAGE_NAME>.activities.MainActivity
9. D/LIFECYCLE: OnStart Ended
10. D/LIFECYCLE: OnResume Started
11. D/LIFECYCLE: OnResume Ended
12. W/<appname>: Accessing hidden method Ldalvik/system/CloseGuard;->get()Ldalvik/system/CloseGuard; (unsupported,core-platform-api, reflection, allowed)
13. W/<appname>: Accessing hidden method Ldalvik/system/CloseGuard;->open(Ljava/lang/String;)V (unsupported,core-platform-api, reflection, allowed)
14. W/<appname>: Accessing hidden method Ldalvik/system/CloseGuard;->warnIfOpen()V (unsupported,core-platform-api, reflection, allowed)
15. D/LIFECYCLE: OnPause Started
16. D/LIFECYCLE: OnPause Ended
17. D/LIFECYCLE: OnDestroy Started
18. D/LIFECYCLE: OnDestroy Ended
19. D/LIFECYCLE: OnCreate Started
20. D/LIFECYCLE: OnCreate Ended
21. D/THREAD: Thread Started
22. D/LIFECYCLE: OnStart Started
23. D/LIFECYCLE: OnStart Ended
24. D/LIFECYCLE: OnResume Started
25. D/LIFECYCLE: OnResume Ended
26. D/THREAD: Thread Ended
27. D/THREAD: Thread Ended
...
logcat中的D/Thread
是我在onCreate()
中创建的网络请求线程
正如你在第8行中看到的,有一个来自ActivityThread的日志,上面写着";安排重新启动活动";。然而,我没有重新开始,也没有重新启动我的活动。该应用程序运行平稳,在打印日志时没有任何重新启动动画或任何滞后。
我尝试了一些解决方案,比如在savedInstanceState
中添加null检查,并在它为null时运行网络线程,但不知何故,网络请求结果和我在线程中发出的UI更改命令在第二个请求中反映了,所以这不好。
最重要的部分:为了找出问题所在,我打开了一个模拟器并测试了我的应用程序。令人惊讶的是,当我用模拟器打开应用程序时,没有活动重新启动日志,也没有重复的响应。它完全按照我的程序运行。
我苦苦挣扎的设备是Pixel 6 Pro(物理设备(。我想让我的应用程序在这个典型的设备上工作。
它怎么会不同呢?为什么会发生这种情况?是否有任何解决方案不自行重新启动活动?
您可以尝试将网络线程封装在savedInstanceState != null
中。我在Pixel 6 Pro上也遇到了同样的问题,在活动发布时进行了碎片调用。无论如何,"活动"都会重新启动,但在我的情况下,片段不会。也许这对你也有用。