2011-04-23 4 views
1

안녕하세요 모든 어떻게 이미지를 다운로드 완료 될 때까지 기다릴이 코드를 만들 수 있습니다.android doInBackground

doInBackground(URL... paths) 대체 할 수 있습니다. 다운로드 후 코드 나머지 부분을 계속 기다립니다.

private class DownloadImageTask extends AsyncTask<URL, Integer, Bitmap> { 
    // This class definition states that DownloadImageTask will take String 
    // parameters, publish Integer progress updates, and return a Bitmap 
    protected Bitmap doInBackground(URL... paths) { 
     URL url; 
     try { 
      url = paths[0]; 
      HttpURLConnection connection = (HttpURLConnection) url 
        .openConnection(); 
      int length = connection.getContentLength(); 
      InputStream is = (InputStream) url.getContent(); 
      byte[] imageData = new byte[length]; 
      int buffersize = (int) Math.ceil(length/(double) 100); 
      int downloaded = 0; 
      int read; 
      while (downloaded < length) { 
       if (length < buffersize) { 
        read = is.read(imageData, downloaded, length); 
       } else if ((length - downloaded) <= buffersize) { 
        read = is.read(imageData, downloaded, length 
          - downloaded); 
       } else { 
        read = is.read(imageData, downloaded, buffersize); 
       } 
       downloaded += read; 
       publishProgress((downloaded * 100)/length); 
      } 
      Bitmap bitmap = BitmapFactory.decodeByteArray(imageData, 0, 
        length); 
      if (bitmap != null) { 
       Log.i(TAG, "Bitmap created"); 
      } else { 
       Log.i(TAG, "Bitmap not created"); 
      } 
      is.close(); 
      return bitmap; 
     } catch (MalformedURLException e) { 
      Log.e(TAG, "Malformed exception: " + e.toString()); 
     } catch (IOException e) { 
      Log.e(TAG, "IOException: " + e.toString()); 
     } catch (Exception e) { 
      Log.e(TAG, "Exception: " + e.toString()); 
     } 
     return null; 

    } 

    protected void onPostExecute(Bitmap result) { 
     String name = ImageLink.substring(ImageLink 
       .lastIndexOf("/") + 1); 
     if (result != null) { 
      hasExternalStoragePublicPicture(name); 
      saveToSDCard(result, name); 
      isImage = true; 

     } else { 
      isImage = false; 

     } 
    } 
} 
+3

귀하의 질문에 이해가되지 않습니다. 'doInBackground()'*는 이미지를 다운로드합니다. 끝내기를 기다릴 수는 없습니다. – CommonsWare

+0

@CommonsWare : 나는 나머지 코드를 다운로드가 끝날 때까지 기다려야한다. 나는 이미지가 끝날 때까지 코드를 계속하고 싶다. 메신저가 1 개 이상의 이미지를 다운로드하고 어떤 이유로 겹쳐서 2 개의 이미지로 끝나기 때문이다. 어떤 것이 ...?! – moe

+0

DownloadImageTask 인스턴스를 만들 코드를 표시하십시오. 여러 인스턴스를 만들고 있습니까? 그렇다면 문제가 될 수 있습니다. – Squonk

답변

2

doInBackground())가 백그라운드에서 실행됩니다. waits for the downloadcontinues with the rest of the code 인 부분은 onPostExecute()입니다. 이것은 아마도 당신이 요구하는 기능입니다.

+0

이 올바른지, AsyncTask 사용법에 따르면 doInBackground가 완료되면 onPostExecute()가 트리거됩니다. 백그라운드에서 진행되므로 UI ​​스레드에게 작업이 완료되었고 메모리 또는 다른 것으로부터 이미지를로드 할 수 있음을 알려야합니다. –

+0

DSouza : onPostExecute()를 추가하고 여전히 같은 문제가 발생했습니다 .... ???! 원래 질문에 대한 코드를 업데이트했습니다. – moe

0

AsyncTask에 대한 요점은 (AsyncTask를 만드는) 활동의 주 코드가 기다리지 않는다는 점입니다. 비동기는 비동기 적으로 짧습니다. 이는 미리 결정된 시간 프레임없이 발생하는 것을 의미합니다.

다른 코드가 실행되기 전에 다운로드 또는 여러 다운로드를 완료하려는 경우 동기식 (Android 활동에는 좋지 않음)으로 수행해야하거나 콜백을 대기 할 코드를 작성해야합니다 .

관련 문제