2012-12-05 2 views
0

웹에서 파일에 다운로드 할 asynctask 클래스를 하나 만듭니다. 나는이 클래스의 객체를 생성하고 실행하면 모든 일이 잘 작동Android 2.1 : 다운로드 파일을 동시에 여러 asynctask 실행

private class DownloadFile1 extends AsyncTask<String, Integer, String> { 

    private boolean done = false; 
    @Override 
    protected String doInBackground(String... sUrl) { 
     done = false; 
     if (isOnline() == true && sdmounted() == true) { 
      try { 
       URL url = new URL(sUrl[0]); // get url 
       HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
       connection.connect(); 
       InputStream in = new BufferedInputStream(connection.getInputStream()); 
       // url[1]= file name 
       OutputStream out = (downloaded == 0) ? new FileOutputStream("/sdcard/Points.ir/" + sUrl[1]) 
         : new FileOutputStream("/sdcard/Points.ir/" 
           + sUrl[1], true); 
       OutputStream output = new BufferedOutputStream(out, 1024); 
       byte[] data = new byte[1024]; 
       int count = 0; 

       while (done != true && isOnline() == true && (count = in.read(data, 0, 1024)) >= 0) { 
        output.write(data, 0, count); 
        downloaded += count; 
       } 
       output.flush(); 
       output.close(); 
       in.close(); 
      } catch (Exception e) { 
      } 
     } else { 
      networkerror = 1; 
     } 
     return null; 
    } 

    @Override 
    protected void onPreExecute() 
    { 
     super.onPreExecute(); 

    } 

    @Override 
    protected void onProgressUpdate(Integer... progress) 
    { 
     super.onProgressUpdate(progress); 

    } 

    @Override 
    protected void onPostExecute(String result) 
    { 
     super.onPostExecute(result); 

    } 
} 

:

내 클래스입니다. 그러나 2 개의 객체를 생성하고 다운로드 2 파일을 실행하면 FC를 얻는 것과 동시에 ?? 무엇을 할 수 있습니까? (나의 나쁜 영어 연설에 대해 유감스럽게 생각한다)

+3

당신이 게시 할 수 있 었는가 오류? – Entreco

+0

한 번에 하나의 asynctask 만 실행할 수 있습니다. 대기열 기능을 원한다면 IntentService를 찾으십시오. – ThePCWizard

답변

1

비동기 태스크는 단지 1 번만 실행될 수있다. 따라서 AsyncTask가 실행 중이면 다시 실행할 수 없습니다. 그것이 String의 목록이 될 수있는 doInBackground 메서드의 String ... param을 갖는 이유입니다.

그래서 대신에 두 개의 객체를 생성, 당신은 다음을 사용할 수 있습니다

DownloadFile1 task = new DownloadFile1(); 
task.execute("url1", "url2", "url3"); // All these urls will be processed after each other 

보다, 당신의 AsyncTask를 doInBackground()에서, 당신이 뭔가를 할 수 있습니다

@Override 
protected String doInBackground(String... sUrl) { 
    done = false; 

    for(int i=0 ; i < sUrl.length ; i++){ 
     if (isOnline() == true && sdmounted() == true) { 
      try { 

       String currentUrl = sUrl[i]; 

       // continue with your code here, using currentUrl instead 
       // of using sUrl[0]; 
      } 
     } 
    } 

} 
관련 문제