Android中使用gRPC为何未抛出NetworkOnMainThreadException?
问题解答
首先明确:gRPC的BlockingStub不会自动切换到后台线程,它的调用就是阻塞当前线程的。你没遇到NetworkOnMainThreadException,主要是这两个原因:
StrictMode未检测到gRPC的网络操作
Android的NetworkOnMainThreadException是由StrictMode机制触发的,而这个机制主要针对系统标准的网络API(比如HttpURLConnection、旧版HttpClient)。gRPC使用自己的底层网络实现(比如基于OkHttp或Netty的定制栈),这些操作不在StrictMode默认的网络检测范围内,所以不会触发异常。StrictMode可能未启用
默认情况下,部分Android版本或开发环境中,StrictMode的网络检测不是强制开启的。如果你的应用没有手动配置StrictMode来检测主线程网络操作,即使在主线程做网络请求,也不会抛出这个异常。
注意:虽然没崩溃,但这种写法仍然是错误的——主线程被阻塞会导致UI卡顿、ANR,必须将BlockingStub的调用放到后台线程(比如用Coroutine、线程池等)。
内容的提问来源于stack exchange,提问作者Saran Sankaran
相关产品推荐
相关产品推荐

