如何解决IDE从Dispatchers.IO协程中的阻塞调用发出警告
我正在开发一个简单的应用程序,该应用程序需要URL调用中的数据。 这是相关的代码部分
class NewsFeed : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_news_feed)
lifecycleScope.launchWhenCreated {
getNewsData()
}
private suspend fun getNewsData() {
withContext(Dispatchers.IO) {
try {
val jObj = Jsoup.connect(getString(R.string.news_feed)).get()
//many non relevant lines
BitmapFactory.decodeByteArray(URL(img).readBytes(),0)
IDE对.get()和URL()方法都发出警告,说这是“不适当的线程阻塞方法调用”
但是,如果我理解正确,我就处于Dispacher.IO协程范围内,并且该工作是在为阻止任务而创建的另一个线程上完成的。 即使通话超时,应用程序也不会粉碎或阻止UI。
除了抑制警告,我在做什么错了?
解决方法
您是对的,Job
是在另一个线程上完成的,但是Thread
是由与协同程序一起工作的Dispatcher
管理的。
如果您在该调度程序中阻塞Thread
,则意味着阻塞时该线程不再可用于协程。
您应该使用那些可以挂起的方法的挂起变体,以防止线程忙于等待。
如果没有挂起的替代方法,则最好使用常规Java线程池或异步调用(例如CompletalbeFuture.supplyAsync
),因为它们更适合常规阻塞代码。
您执行此操作的方法是正确的,这只是检查工具的问题。
Dispatchers.IO
正是针对这些情况而设计的,因为它分配了其他线程来跟上并发阻塞的IO操作。
其中一位kotlin开发人员也对此进行了解释: https://medium.com/@elizarov/blocking-threads-suspending-coroutines-d33e11bf4761
特别是“将IO阻止到挂起”段落建议使用
withContext(Dispatchers.IO){
...
}
用于阻止IO,例如网络通话或读取文件
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。