2013-01-22 14 views
1

나는 비슷한 질문을 여기에서 받았습니다 AsyncTask and Progressbar.AsyncTask에서 파일 다운로드 진행 상황을 추적합니다.

내가하고있는 일은 배경 AsyncTask에서 두 개 이상의 파일을 하나씩 다운로드하도록 예약하는 것입니다. UI 스레드는 사용자 상호 작용에 따라 언제든지 해당 파일 중 하나가 필요할 수 있습니다. 그리고 if UI 스레드가 요청할 때 파일 다운로드가 완료되지 않았습니다. 특정 파일의 다운로드 진행 상황을 표시해야합니다.

특정 파일 다운로드의 진행률 표시 줄에 대해 몇 가지 대답을 보았습니다. 하지만 제 요구 사항은 다소 다릅니다. 백그라운드에서 진행되는 파일 다운로드 진행 상태를 추적해야합니다.

+1

실제로 사용자에게 진행 상황을 보여줄 필요가있을 때만 'ProgressDialog'에서'show'를 호출하는 것을 제외하고는 찾은 예제를 따르지 않는 것이 어떻습니까? – iagreen

+0

나는 그것을 실제로 시도했다. 파일 다운로드가 완료되지 않은 경우 AsyncTask에 선언 된 progressBar에 show 메서드를 호출합니다.하지만이 방법은 작동하지 않습니다. 당신이 의미하는 바를 코드 스 니펫으로 도울 수 있습니까? 고마워요. – sampath

답변

1

각 다운로드는 자체 스레드에서 실행해야합니다 (하나의 파일이 더 작은 경우, 하나의 서버가 더 빠른 경우 등).

다운로드를 위해 URI 또는 ​​다른 식별자로 매개 변수화 된 스레드를 확장하거나 실행 파일을 생성 해보십시오. 일단 그렇게하면 완료 될 때까지 실행할 두 개의 스레드를 호출 할 수 있습니다. UI (진행률 표시 줄)를 업데이트해야하는 경우 처리기를 구현하고 스레드에서 처리기로 메시지를 보내야합니다. 예 : 주요 활동 클래스의

:

public static final int UPDATE_PROGRESS_BAR =0; 
    public final Handler uiHander = new Handler(){ 
     public void handleMessage(Message msg){ 
      switch(msg.what){ 
      case UPDATE_PROGRESS_BAR: // Something like this to handle the case of progress bar update 
       int updateAmount = msg.obj; 
       // do something to update prog. bar 
       break; 

다음 스레드가 그냥 메시지를 보낼에,이 핸들러에 대한 참조가 필요합니다은

 uiHander.obtainMessage(<activity name>.UPDATE_PROGRESS_BAR,<integer update>).sendToTarget(); 

이것은 대부분의 휴대용 방법이 될 수 있습니다 비동기 작업 구현으로 버전을 버전으로 변경했으며 두 다운로드를 동시에 실행할 수도 있고하지 않을 수도 있습니다 (분명히 원하는 것임)

1

AsyncTask를 사용하는 경우 onProgressUpdate (Progress ...) 사용 옵션 (publishProgress (Progress ...) 호출 후 UI 스레드에서 호출 됨).

예.

private class DownloadFilesTask extends AsyncTask<File, Integer, Long> { 
protected Long doInBackground(File... file) { 
    // This will call onProgressUpdate 
    publishProgress((int) ((i/(float) count) * 100)); 
} 

// this will be called on the UI thread 
protected void onProgressUpdate(Integer... progress) { 
    setProgressPercent(progress[0]); 
} 

protected void onPostExecute(Long result) { 
    showDialog("Downloaded " + result + " bytes"); 
} 
} 

AsyncTask를 사용하지 않는 경우 처리기를 만들고 UI 스레드에 메시지를 게시 할 수 있습니다.

그러나 파일 (안드로이드 문서에서) 고려해야 할 몇 가지를 다운로드 당신이 언급으로 : - 다운로드를 시작하기 전에 확인하고 경고한다, 그래서

  • 이 장치는, 확장 파일 저장하기위한 공간이 충분하지 않을 수 있습니다 사용자에게 충분한 공간이없는 경우
  • 다운로드가 완료되는 동안 사용자 상호 작용을 차단하고 사용자가 앱을 나가는 것을 방지하려면 파일 다운로드가 백그라운드 서비스에서 수행되어야합니다.
  • 정상적으로 처리해야하는 요청 및 다운로드 중에 다양한 오류가 발생할 수 있습니다.
  • 다운로드 중에 네트워크 연결이 변경 될 수 있으므로 이러한 변경 사항을 처리해야하며, 중단 된 경우 가능한 경우 다운로드를 다시 시작하십시오.
  • 백그라운드에서 다운로드가 진행되는 동안 다운로드 진행률을 나타내는 알림을 제공하고 완료되면 사용자에게 알리고 선택한 경우 사용자를 응용 프로그램으로 되돌려 보내야합니다.

다행히도 위의 내용은 모두 Google의 라이브러리에 들어 있으며, 앱을 종료한다고해도 진행 상황에 대한 알림을 다운로드 할 수 있습니다. 그것을 사용하거나 소스를 자신의 필요에 맞게 수정할 수 있습니다. 당신은 DownloadManager를 사용할 수 있지만 그것은 당신의 조회수의 진행 상황을 표시하지 않습니다 여기

http://developer.android.com/google/play/expansion-files.html#AboutLibraries

+0

당신은 UI 스레드에서 onProgressUpdate를 호출 할 수 있다는 것을 의미합니까?. 파일이 여전히 다운로드 중인지 확인하고 싶으면 progressBar를 표시해야합니다. 각 파일 다운로드마다 DownloadFileTask 배열이 있고 각 파일에 progressBar가 선언되어 있습니다. 파일이 계속 다운로드중인 경우 progressBar.show와 같은 작업을 수행하려고합니다. – sampath

+1

onProgressUpdate가 UI 스레드에서 호출되며 Android 핸들 AsyncTask 구현의 일부로서 이것을 사용할 수 있습니다. 따라서 logic이 필요하다고 판단 할 때 거기에서 progressBar.show를 호출하는 것이 안전합니다. – Ryan

+0

소리가 좋습니다. 나는 이것을 시도하고 당신에게 돌아갈 것입니다. 고마워, 너의 도움을 .. – sampath

0

더 많은 정보를 원하시면. 다른 옵션은 ExecutorService을 사용하고 사용자 정의 Runnable 작업을 제출하는 것입니다. 제출 된 작업 맵을 유지 관리하는 사용자 정의 클래스에 ExecutorService을 입력하십시오. 파일이 필요할 때마다 작업이 완료되었는지 여부를이 클래스에 쿼리하고 실행중인 작업의 ListView를 표시 할 수 있습니다.

관련 문제