【问题标题】:DownloadManager throw android.os.NetworkOnMainThreadException下载管理器抛出 android.os.NetworkOnMainThreadException
【发布时间】:2021-05-09 01:00:04
【问题描述】:

DownloadManager throw android.os.NetworkOnMainThreadException 仅适用于三星设备 (Android 10)。

            val request = DownloadManager.Request(Uri.parse(url))
            val fileName = parseFileName(url)
            request.addRequestHeader("Cookie", CookieManager.getInstance().getCookie(url))
            request.allowScanningByMediaScanner()
            request.setNotificationVisibility(
                DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED
            ) 
            request.setDestinationInExternalPublicDir(
                Environment.DIRECTORY_DOWNLOADS,
                fileName
            )
            val dm = activity.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager?
            dm?.enqueue(request)

堆栈跟踪:

Fatal Exception: android.os.NetworkOnMainThreadException
       at android.os.Parcel.createException(Parcel.java:2098)
       at android.os.Parcel.readException(Parcel.java:2056)
       at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:188)
       at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:140)
       at android.content.ContentProviderProxy.insert(ContentProviderProxy.java:481)
       at android.content.ContentResolver.insert(ContentResolver.java:1835)
       at android.app.DownloadManager.enqueue(DownloadManager.java:1544)

dm?.enqueue(request) 抛出 android.os.NetworkOnMainThreadException。虽然可以在主线程中调用。

我该如何解决这个问题?

【问题讨论】:

  • 在后台线程中运行任何与下载相关的东西。
  • 我们可以在主线程中运行 DownloadManager.eneque()。
  • 它适用于其他设备。
  • @RageTF 这些设备的 SDK 级别是多少? Android 5 (Lolipop) -> SDK 22, Android 6 (Marshmallow) -> SDK 23, ..。顺便说一句,您应该使用@<username> 来注释用户,以便用户得到通知。
  • @Darkman 谢谢。 Android 10 -> SDK 29

标签: android android-service samsung-mobile samsung-galaxy


【解决方案1】:

刚收到这个错误,结果是:我没有包含文件扩展名!!

例如:xxx.png

【讨论】:

    【解决方案2】:

    我在三星设备(s9 和 a71)上遇到了同样的问题。我用 .setDestinationInExternalFilesDir(context, Environment.DIRECTORY_DOWNLOADS, fileName) 代替 .setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName) 它也适用于三星设备。

    【讨论】:

      【解决方案3】:

      @RageTF 不知道为什么要感谢我,但是当应用程序尝试在其主线程上执行网络操作时会抛出 NetworkOnMainThreadException。这仅针对面向 Honeycomb SDK 11 或更高版本的应用程序抛出。允许针对早期 SDK 版本的应用程序在其主事件循环线程上进行网络连接,但强烈建议不要这样做。因此,如果您尝试在 UI 线程 上执行任何这些操作,则必须将它们包装在 工作线程 中。大多数情况下,错误源于将昂贵的操作直接放在UI线程上。为确保您不会破坏用户体验,在单独的 Thread 类上执行 Socket 连接、HTTP 请求、文件下载和其他长期操作非常重要。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-15
      • 1970-01-01
      • 2016-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-09
      • 1970-01-01
      相关资源
      最近更新 更多