2017-11-09 6 views
1

UPDATEIOException이 : AsyncTask를 이미지 다운로드 코 틀린 안드로이드 (잘못된 파일 설명자) 디버깅 후

, 나는 주어진 코드에서 Catch 블록은 예외 예외없이 실행 얻을 것을 찾을 수 있습니다. 일부 값을 반환하는 입력 스트림을 인쇄합니다. 이벤트 비트 맵 varibale은 초기화되지만 catch 블록을 실행하면 onPostExecute 메서드에 null을 반환합니다.

왜 이런 일이 일어나고 있는지 알아보십시오.

Please check debug screenshot of studio

END 것은

것은 내가 안드로이드 스튜디오 3.0을 사용하고 있습니다.

AsyncTask 클래스 및 HTTPURLConnection 클래스의 도움으로 http 프로토콜 url에서 이미지를 다운로드하는 Kotlin Support로 간단한 Android 응용 프로그램을 만들었습니다.

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 
} 
+0

'connection.disconnect()'내가 아직 스트림에서 읽을 원한다면 그렇게하지 않을 것입니다. – greenapps

+0

이미 입력 스트림 참조를 수집했습니다 : 연결선을 끊기 전에 하지만 connection.disconnect()를 제거한 후에도 여전히 동일한 오류가 발생합니다. –

+0

'connection.doOutput = true' 해당 명령문을 제거하십시오. 그것은 POST를위한 것입니다. – greenapps

답변

1

당신은 당신이 이미 응답 본문을 읽을 후 분리 호출해야합니다.

+0

connection.disconnect() 제거, 여전히 같은 오류 –

1

그것은 자바의,하지만 당신은 코 틀린에 적응 할 수

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

를 사용하여 동일한 작업을 실행하지 않고 바로 함수에서 반환 Java의 논리이지만 IOException이 발생합니다. –

+0

@GaneshTikone 어느 행에 있습니까? 게시 스택 추적 –

+0

@ Florescu George Cătălin : 업데이트 된 질문. 코드에 의해 던져진 예외가 없더라도 catch 블록이 실행됩니다. –