在服务内部,我可以在不冻结应用程序的情况下同步 http 请求 UI 吗?
Inside a service, can i do sync http request without freezing the app UI?
在服务内部,我可以在不冻结应用程序的情况下同步网络请求吗UI?我听说服务在与应用程序 ui 线程相同的线程上工作(我听说过,但我不确定)
Android 服务将使用相同的 UI 线程。所以你不能直接从 UI 线程发出网络请求。
您可以通过创建新线程并让 UI 线程等待来发出同步请求 - 不推荐,因为它会挂起 UI 最终导致 "ANR"
最好的解决方案是重写您的应用程序逻辑以异步方式工作...:)
您还可以查看使用工作线程的 Intent Services。但它又是异步的
同步请求会在 Android 4.0 或更高版本上触发应用程序崩溃。你会 运行 进入 NetworkOnMainThreadException
错误。
同步方法在主线程上执行。这意味着 UI 在请求执行期间会阻塞,并且在此期间无法进行交互。
Service
的 onStartCommand()
在主线程上被调用。但是,在 onStartCommand()
中,您可以简单地启动一个后台线程并在那里完成所有网络 I/O。后台线程可以阻塞而不会导致任何问题。
希望这能为您指明正确的方向
注意:服务运行在其托管进程的主线程中;该服务不会创建自己的线程,也不会 运行 在单独的进程中,除非您另有说明。如果您的服务要执行任何 CPU 密集型工作或阻塞操作,例如 MP3 播放或网络,您应该在服务中创建一个新线程来完成该工作。通过使用单独的线程,您可以降低应用程序无响应 (ANR) 错误的风险,并且应用程序的主线程可以继续专用于用户与您的活动的交互。
https://developer.android.com/guide/components/services.html
通过服务在主循环中执行长时间 运行ning 同步操作应用程序是一种风险权衡。
在服务内部,我可以在不冻结应用程序的情况下同步网络请求吗UI?我听说服务在与应用程序 ui 线程相同的线程上工作(我听说过,但我不确定)
Android 服务将使用相同的 UI 线程。所以你不能直接从 UI 线程发出网络请求。
您可以通过创建新线程并让 UI 线程等待来发出同步请求 - 不推荐,因为它会挂起 UI 最终导致 "ANR"
最好的解决方案是重写您的应用程序逻辑以异步方式工作...:)
您还可以查看使用工作线程的 Intent Services。但它又是异步的
同步请求会在 Android 4.0 或更高版本上触发应用程序崩溃。你会 运行 进入 NetworkOnMainThreadException
错误。
同步方法在主线程上执行。这意味着 UI 在请求执行期间会阻塞,并且在此期间无法进行交互。
Service
的 onStartCommand()
在主线程上被调用。但是,在 onStartCommand()
中,您可以简单地启动一个后台线程并在那里完成所有网络 I/O。后台线程可以阻塞而不会导致任何问题。
希望这能为您指明正确的方向
注意:服务运行在其托管进程的主线程中;该服务不会创建自己的线程,也不会 运行 在单独的进程中,除非您另有说明。如果您的服务要执行任何 CPU 密集型工作或阻塞操作,例如 MP3 播放或网络,您应该在服务中创建一个新线程来完成该工作。通过使用单独的线程,您可以降低应用程序无响应 (ANR) 错误的风险,并且应用程序的主线程可以继续专用于用户与您的活动的交互。 https://developer.android.com/guide/components/services.html
通过服务在主循环中执行长时间 运行ning 同步操作应用程序是一种风险权衡。