谁能解释为什么我的代码中会弹出这些“不适当的阻止方法调用”警告?

2024-04-16

我在 Kotlin 中编写了这段代码,使用协程下载一些 API 信息来下载数据。然而,代码显示了很多警告,将消息声明为“不适当的阻塞方法调用".

这是代码:

class DownloadInfoClass {
    private lateinit var url: URL
    private lateinit var httpURLConnection: HttpURLConnection
    private lateinit var result: String
    private lateinit var inputStream: InputStream
    private lateinit var inputStreamReader: InputStreamReader
    private var dataMap: MutableMap<String, Any> = mutableMapOf()

    private fun downloadMethod(urls: String){
        CoroutineScope(IO).launch {
            try {
                url = URL(urls)
                httpURLConnection = url.openConnection() as HttpURLConnection
                inputStream = httpURLConnection.inputStream
                inputStreamReader = InputStreamReader(inputStream)

                var data: Int = inputStreamReader.read()
                while (data != -1){
                    val current: Char = data.toChar()
                    result += current
                    data = inputStreamReader.read()
                }
            }

            catch (e: Exception){
                e.printStackTrace()
            }
        }
        Log.i("Result: ", result)
    }
}

出现该问题的具体区域是:

  1. URL(urls)
  2. openConnection()
  3. read()

谁能帮助我理解为什么会发生这种情况?我通读了 Kotlin 文档,但无法理解。另外,您能告诉我如何解决这个问题吗?


问题是,协程的构建目的只是suspend并且不阻塞线程。这意味着多个协程可以在同一个线程上运行。当使用阻塞方法时,它们会阻塞整个线程,并且可能会阻止其他协程运行。因此,这样做通常是不好的做法。

由于您显然需要调用这些方法,因此请使用尝试为每个协程创建一个新线程的调度程序,例如Dispatchers.IO(这是为这些操作而设计的,请参阅文档 https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-i-o.html)。为此,只需将阻塞调用包装起来withContext.

withContext(Dispatchers.IO) { 
   // your blocking calls 
}

我希望我能帮忙!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

谁能解释为什么我的代码中会弹出这些“不适当的阻止方法调用”警告? 的相关文章

  • 在PC上的Firefox上模拟Android的Webview?

    作为我的软件开发工作 针对 Android 的一部分 我需要在通过 Android 的 WebView 查看时检查大量 HTML 页面的内容 到目前为止 我已经能够通过将 HTML 内容转储到文件中来实现这一点 data data
  • 不带 Firebase 的集成 AdMob:不需要的权限 (C2D)

    我正在使用 Firebase 将旧游戏从 AdMob 移植到最新的 AdMob 我使用的是已弃用的 AdMob 版本 我想要尽可能最小的集成 我不需要 Firebase 分析 我有一个工作集成 使用 Android Studio 项目 但是
  • NavigationUI 无法与底部导航视图实现一起正常工作

    所以我有一个场景 其中我有 5 个带有底部导航的片段 1 主页 2 收件箱 3 搜索 4 通知 5 个人资料 因此 我有另一个名为 BarcodeDetail 的片段 我从 Home Fragment 导航到该片段 首页 gt 条码详情 现
  • Android BLE API:未收到 GATT 通知

    用于测试的设备 Nexus 4 Android 4 3 连接工作正常 但onCharacteristicChanged我的回调方法从未被调用 但是我正在使用注册通知setCharacteristicNotification char tru
  • 如何从 TextInputLayout 中删除底部填充

    第一张图就是我想要的 第二张图是我实现的 正如您所看到的 TextInputLayout 的底部有一个填充 这使得灰色背景溢出超过 edittext 行 请不要建议负边距或填充 因为它在较新的 API 中不起作用 这是我为第一个文本输入布局
  • 在可扩展列表中突出显示所选项目

    我有一个布局 其中左侧的片段中有一个可扩展列表 右侧有一个详细信息片段 这一切都很好 现在我想指出左侧的哪个项目的详细信息显示在右侧 而我在这里遇到了问题 在普通列表视图中 我通过将列表视图的选择模式设置为单一 然后使用基于 激活 状态的状
  • GCM 卷曲操作超时

    我的服务器上存储了几个负责 GCM 操作的 php 文件 它们似乎在需要时工作得很好 但它们经常返回一个错误 指出 卷曲错误 操作在 0 毫秒后超时 0 中的 0 收到的字节数 这是服务器的问题还是我的 GCM 代码的问题 下面是我的 ph
  • Android 列表视图在滚动时会在文本上产生黑色突出显示。如何阻止这个?

    Duplicate 背景ListView滚动时变黑 https stackoverflow com questions 2833057 background listview becomes black when scrolling lq
  • Android 中自定义通知的确切时间

    我正在开发一个用于咨询服务的 Android 应用程序 客户可以在应用程序中查看他们的预约 例如 下次预约 2016 年 12 月 31 日 上午 10 00 现在我需要做的是 用户将收到 2 条通知 有关预约的提醒 7 天前一次 3 天前
  • Android NSD 未发现所有服务

    我正在尝试使用 Android 本机服务发现来运行应用程序 但有时当我运行该应用程序时 它不会发现我的网络中的所有服务 我正在运行代码https github com joeluchoa nsd https github com joelu
  • 为什么android找不到com.google.gson.Gson

    我正在尝试在我的项目中使用 GSON 但我的应用程序崩溃了 logcat 说找不到 com google gson Gson 我已将 import com google gson Gson 放在我的类文件中 我的包资源管理器中有 gson
  • 如何创建自定义主题并在 Android 应用程序中使用它?

    如何创建自定义主题并在代码中使用它 菜单中如何实现主题选项并申请活动 有一个不错的风格和主题指南 http developer android com guide topics ui themes html在 Android 开发者网站上
  • 如何消除使用 DrawerLayout 打开 Activity 时的延迟?

    我有一个带有 DrawerLayout 的活动 但每当它打开时 都会有一个延迟 就像屏幕变白然后绘制我的屏幕一样 这发生在转换完成后 所以看起来屏幕动画过渡有点跳跃 在将视图与 ButterKnife 绑定后 我尝试将其放在 OnCreat
  • 找不到 R.layout.activity_main

    我试图使用一些在线教程来解决多种布局 问题是只要只有一个 XML 文件 我的程序就可以正确构建和编译 当我添加多个 XML 文件时 我收到错误消息 指出该行的 activity main 无法解析或不是字段 setContentView R
  • 如何从复选框数组中保存布尔状态并在使用 SharedPreferences 加载适配器时加载其状态

    我有一个用于列表视图的 CustomAdapter 我需要使用 SharedPreferences 保存布尔数组中的所有复选框状态 我想将技巧的名称 字符串数组 保存为键和每个技巧的状态 我想到的 SharedPreferences 示例
  • 如何获取 Android 中其他应用程序的屏幕时间?

    我想达到在 Android 系统上运行的每个应用程序的屏幕时间 例如 Facebook 工作时间为 3 小时 但屏幕时间为 1 2 小时 我怎么才能得到它 android app usage 使用情况统计 public final clas
  • 带 Retrofit 的 JSON 解析

    我最近开始使用Retrofit 我对此了解不多 我用谷歌搜索了这个问题 但没有答案适合我的问题 这是 JSON 响应 results description eng This is second time testing img url t
  • 使用 HttpClient 的 HTTP 请求太慢?

    我正在尝试编写一个 Android 应用程序 将一些发布值发送到托管在专用服务器上的 php 文件并存储数组结果 代码是这样的 HttpPost httppost DefaultHttpClient httpclient httppost
  • 如何创建可以使用拨号盘启动的应用程序

    我想知道如何使用 Dialpad 中的一些代码启动我的 Android 应用程序 就像如果你 3214789650 它会从您的星系启动angryGps 应用程序 如何实施 Thanks 试试这个 使用广播接收器来监听去电号码 清单 xml
  • 滚动时重用视图时保存 RecyclerView 中所选项目的状态

    我为 recyclerView 创建了一个 Adapter 和 ViewHolder 我将 itemView 的 imageButton 绑定到 Viewholder 内 并在 onBindViewHolder 中设置了一个 onClick

随机推荐