android 在协同程序的Dispatchers.IO内部调用getExternalFilesDir()方法是一个好的实践吗?

6pp0gazn  于 2023-02-17  发布在  Android
关注(0)|答案(1)|浏览(177)

在生产应用程序中,我们很少看到getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)?.absolutePath方法调用导致ANR问题的情况。
为了解决这个问题,我们可以使用协程吗?
像这样东西

lifecycleScope.launch {
    val envPath = withContext(Dispatchers.IO) { getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)?.absolutePath.orEmpty() }
    // code, which will utilize the envPath
  }

因为getExternalFilesDir()方法是ContextWrapper的一部分,所以如果我们使用协程在不同的线程中调用它,它会产生任何问题吗?

ttcibm8c

ttcibm8c1#

getExternalFilesDir使用android.os.storage.StorageManager,这是Android系统服务,StorageManager在单独的进程中执行,因此可能会阻塞很长时间。
Kotlin协同程序:Deep Dive(Dispatchers一章)建议对可能阻塞线程的代码使用Dispatchers.IO。
综上所述,使用getExternalFilesDir的后台线程是完全有意义的。

相关问题