如何解决下载管理器抛出 android.os.NetworkOnMainThreadException
DownloadManager 仅在三星设备 (Android 10) 上抛出 android.os.networkonmainthreadException
。
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
。虽然可以在主线程中调用。
我该如何解决这个问题?
解决方法
我在三星设备(s9 和 a71)上遇到了同样的问题。我用
.setDestinationInExternalFilesDir(context,Environment.DIRECTORY_DOWNLOADS,fileName)
代替
.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS,fileName)
它也适用于三星设备。
@RageTF 不知道你为什么感谢我,但是当应用程序尝试在其主线程上执行网络操作时会抛出 NetworkOnMainThreadException
。这仅适用于面向 Honeycomb SDK 11 或更高版本的应用程序。允许面向早期 SDK 版本的应用程序在其主事件循环线程上进行网络连接,但强烈建议不要这样做。因此,如果您尝试在 UI 线程上执行任何这些操作,您必须将它们包装在一个工作线程中。大多数情况下,错误源于直接在 UI 线程上放置昂贵的操作。为确保您不会破坏用户体验,在单独的 Thread
类上执行套接字连接、HTTP 请求、文件下载和其他长期操作非常重要。
刚刚收到这个错误,结果是:我没有包含文件扩展名!!
例如:xxx.png
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。