2012-11-19 4 views
-2

나는 파일을 다운로드하려면이 클래스를 사용하고 있습니다 :AsyncTask를 사용하여 파일을 다운로드하는 방법은 무엇입니까?

public class DownloadService extends Service { 
    String downloadUrl; 
    LocalBroadcastManager mLocalBroadcastManager; 
    ProgressBar progressBar; 
    File sdCard = Environment.getExternalStorageDirectory(); 
    File dir = new File (sdCard.getAbsolutePath() + "/org.test.download/"); 
    double fileSize = 0; 
    DownloadAsyncTask dat; 
    @Override 
    public IBinder onBind(Intent arg0) { 
     return null; 
    } 

    public DownloadService(String url,Context c, ProgressBar pBar){ 
     downloadUrl = url; 
     mLocalBroadcastManager = LocalBroadcastManager.getInstance(c); 
     progressBar = pBar; 
     dat = new DownloadAsyncTask(); 
     dat.execute(new String[]{downloadUrl}); 

    } 

    private boolean checkDirs(){ 
     if(!dir.exists()){ 
      return dir.mkdirs(); 
     } 
     return true; 
    } 
    public void cancel(){ 
     dat.cancel(true); 
    } 
    public class DownloadAsyncTask extends AsyncTask<String, Integer, String>{ 

     @Override 
     protected String doInBackground(String... params) { 
       String fileName = downloadUrl.substring(downloadUrl.lastIndexOf("/")+1); 
       if(!checkDirs()){ 
        return "Making directories failed!"; 
       } 
       try { 
        URL url = new URL(downloadUrl); 
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
        urlConnection.setRequestMethod("GET"); 
        urlConnection.setDoOutput(true); 
        urlConnection.connect(); 
        fileSize = urlConnection.getContentLength(); 
        FileOutputStream fos = new FileOutputStream(new File(dir,fileName)); 
        InputStream inputStream = urlConnection.getInputStream(); 
        byte[] buffer = new byte[500]; 
        int bufferLength = 0; 
        int percentage = 0; 
        double downloadedSize = 0; 
        while ((bufferLength = inputStream.read(buffer)) > 0) 
        { 
         if(isCancelled()){ 
          break; 
         } 
         fos.write(buffer, 0, bufferLength); 
         downloadedSize += bufferLength; 
         percentage = (int) ((downloadedSize/fileSize) * 100); 
         publishProgress(percentage); 
        } 
        fos.close(); 
        urlConnection.disconnect(); 
       } catch (Exception e) { 
        Log.e("Download Failed",e.getMessage()); 
       } 
       if(isCancelled()){ 
        return "Download cancelled!"; 
       } 
      return "Download complete"; 
     } 
     @Override 
     protected void onProgressUpdate(Integer... values){ 
      super.onProgressUpdate(values[0]); 
      if(progressBar != null){ 
       progressBar.setProgress(values[0]); 
      }else{ 
       Log.w("status", "ProgressBar is null, please supply one!"); 
      } 
     } 

     @Override 
     protected void onPreExecute(){ 
      mLocalBroadcastManager.sendBroadcast(new Intent("org.test.download.DOWNLOAD_STARTED")); 
     } 

     @Override 
     protected void onPostExecute(String str){ 
      mLocalBroadcastManager.sendBroadcast(new Intent("org.test.download.DOWNLOAD_FINISHED")); 
     } 

     @Override 
     protected void onCancelled(){ 
      mLocalBroadcastManager.sendBroadcast(new Intent("org.test.download.DOWNLOAD_CANCELLED")); 
     } 

    } 

} 

나는 때문에 분명히 DownloadManager 실 거예요 일 이전에 API 9이 사용하고와 나는 XML 파일을 구문 분석 내가 ListViewAPI 7

을 대상으로하고있어 다운로드 할 수있는 패키지를 보여줍니다.

URL을 포함하는 문자열의 배열을 받아들이고 하나씩 다운로드하도록이 클래스를 수정하려면 어떻게해야합니까?

또는 파일 목록을 다운로드하는 좋은 방법이 있습니까?

+1

당신의 대답은 여기에 숙박 할 수 있습니다 : http://stackoverflow.com/questions/7660963/downloading-multiple-files-one-by-one-using-asynctask – PhatHV

+0

P/S를 : 나는 downvoter 아니에요. – PhatHV

답변

2

IntentService를 사용하십시오. IntentService의 스레드는 백그라운드에서 실행되므로 스레드 처리의 모든 엉망을 처리 할 필요가 없습니다.

IntentService는 완료되면 스레드를 종료하므로 데이터를 유지해야합니다.

액티비티로 다시 통신하려면 브로드 캐스트 리시버를 사용하십시오.

+0

샘플 코드를 제공해 줄 수 있습니까? – Nevercom

관련 문제