我正在开发一个简单的应用程序,需要来自 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, 0)
IDE 对 .get() 和 URL() 方法发出警告,称这是“不适当的线程阻塞方法调用”
但是,如果我理解正确的话,我位于 Dispacher.IO 协程范围内,并且该工作是在为阻塞任务创建的不同线程上完成的。
即使我使调用超时,应用程序也不会破坏或阻止 UI。
除了抑制警告之外,我做错了什么?
你的做法是正确的,这只是检查工具的问题。
Dispatchers.IO
正是针对这些情况而设计的,因为它分配额外的线程来跟上并发阻塞 IO 操作。
一位 kotlin 开发人员也对此进行了解释:https://medium.com/@elizarov/blocking-threads-suspending-coroutines-d33e11bf4761 https://medium.com/@elizarov/blocking-threads-suspending-coroutines-d33e11bf4761
具体来说,“阻止 IO 暂停”段落建议使用
withContext(Dispatchers.IO){
...
}
用于阻塞 IO,例如网络调用或读取文件
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)