IOException: AsyncTask Image Download Kotlin Android (Bad File Descriptor)

Posted

技术标签:

【中文标题】IOException: AsyncTask Image Download Kotlin Android (Bad File Descriptor)【英文标题】: 【发布时间】:2018-04-22 13:03:22 【问题描述】:

更新

经过一些调试,我发现 给定代码中的 Catch 块在没有任何异常异常的情况下执行。 我打印返回一些值的输入流,事件位图变量被初始化,但是一旦它执行了 catch 块,它就会返回 null 到 onPostExecute 方法。

寻找它发生的原因?

Please check debug screenshot of studio

结束

我使用的是 android Studio 3.0。

使用 Kotlin 支持创建简单的 android 应用程序,该应用程序在 AsyncTask 类和 HTTPURLConnection 类的帮助下从给定 http 协议 url 下载图像。

在执行 AsyncTask 类时,我从 HTTPURLConnection 对象获取 http 响应代码 200,但是在使用 BitmapFactory.decodeStream(inputstream) 方法解码流时抛出 IOEXception。

StackTrace 容易出错 原因:android.system.ErrnoException: recvfrom failed: EBADF ,在调用此 BitmapFactory.decodeStream(inputstream) 方法的同一行。

    override fun doInBackground(vararg args: String?): Bitmap? 

    var bitmap: Bitmap? = null

    try 

        val url = URL(args[0])
        val connection: HttpURLConnection = url.openConnection() as HttpURLConnection

        connection.requestMethod = "GET"
        connection.connectTimeout = 10 * 60 * 60
        connection.readTimeout = 10 * 60 * 60
        connection.doInput = true
        connection.doOutput = true

        connection.connect()
        val responseCode = connection.responseCode
        if (HTTP_OK == responseCode) 
            if (null != connection.inputStream) 
                val inputStream = connection.inputStream
                connection.disconnect()
                bitmap = BitmapFactory.decodeStream(inputStream)
            
        else
            Log.e("####","Error Response Code: $responseCode")
        

     catch (ex: IOException) 
        Log.e("####",ex.localizedMessage)

     catch (ex: MalformedURLException) 
        ex.printStackTrace()

     catch (ex: Exception) 
        ex.printStackTrace()

    

    return bitmap

【问题讨论】:

connection.disconnect() 如果我还想从流中读取数据,我不会这样做。 我已经收集了输入流参考:在断开线路之前但即使在删除 connection.disconnect() 之后我仍然收到同样的错误。 connection.doOutput = true 删除该声明。这是POST。 我使用的网址:controltech.biz/wp-content/uploads/2015/06/… @geenapps:还是同样的问题 【参考方案1】:

您应该只在您已经阅读响应正文之后调用 disconnect。

【讨论】:

【参考方案2】:

它是 java,但你可以将它改编为 Kotlin:

HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();
Bitmap myBitmap = BitmapFactory.decodeStream(input);
connection.disconnect()

【讨论】:

使用与 Java 相同的逻辑但得到 IOException。 @GaneshTikone 在哪一行?发布堆栈跟踪 @ Florescu George Cătălin:更新问题,即使代码没有抛出异常,Catch 块也会被执行。 @GaneshTikone 有什么错误?我在您的屏幕截图中没有看到任何堆栈跟踪。你让代码运行,然后在它之后查看你的 Logcat。

以上是关于IOException: AsyncTask Image Download Kotlin Android (Bad File Descriptor)的主要内容,如果未能解决你的问题,请参考以下文章

im4java包处理图片

调用imagick做图片等比例压缩5M到100kb

async的用法

XBannner

java验证码

HttpsURLConnection