【发布时间】:2021-02-04 10:39:13
【问题描述】:
我正在开发一个需要来自 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。
除了抑制警告,我做错了什么?
【问题讨论】:
-
协程在这件事上有点奇怪,如果你仔细看看
withContext,该方法会将新的调度程序与之前的上下文相加,所以你所拥有的是Main加上@ 987654324@,因为在launchWhenCreated里面,所以从那里会得到以前的上下文。不是解决方案,但希望能给你一些线索。 -
感谢您的提问,很久以前我就有同样的问题了。据我记得,在 AS 3.6 中,当调用被包裹在
Dispatchers.IO中时,警告就会消失。此外,根据我使用分析器的经验,实际方法是在Dispatchers.Main之外执行的。您可以根据自己的情况自行验证。 -
@cutiko 更改我理解的对 lifeCycle.lunch(Dispachers.IO) 的调用会将 main + IO 上下文更改为仅 IO 并不能解决问题。
-
@SiddharthKamaria 它不会阻塞主线程我可以告诉你那么多,我不明白如何验证。
-
@error86 这也是我的经验,这就是我上面所说的。我的意思是在主要上下文之外,很抱歉造成误解:)