2015-12-12 45 views
2

所以我有一個應用程序,這將下載某些文件,獻給我的一個客戶,誰是託管在遠程位置他的文件,我這樣做使用下面的代碼:Android的下載多個文件隨同InputStream FileOutputStream中

public class DownloadService extends IntentService { 

    private int result = Activity.RESULT_CANCELED; 
    public DownloadService() { 
     super("DownloadService"); 
    } 
    @Override 
    protected void onHandleIntent(Intent intent) { 
     String urlPath = intent.getStringExtra(URL); 
     String fileName = intent.getStringExtra(FILENAME); 
     File output = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), 
       fileName); 
     if (output.exists()) { 
      output.delete(); 
     } 

     URLConnection streamConnection = null; 
     InputStream stream = null; 
     FileOutputStream fos = null; 
     try { 

      URL url = new URL(urlPath); 
      streamConnection = url.openConnection(); 
      stream = streamConnection.getInputStream(); 
      streamConnection.connect(); 
      long lengthofFile = streamConnection.getContentLength(); 
      InputStream reader = stream; 
      bis = new BufferedInputStream(reader); 
      fos = new FileOutputStream(output.getPath()); 
      int next = -1; 
      int progress = 0; 
      int bytesRead = 0; 
      byte buffer[] = new byte[1024]; 
      while ((bytesRead = bis.read(buffer)) > 0) { 
       fos.write(buffer, 0, bytesRead); 
       progress += bytesRead; 
       int progressUpdate = (int)((progress * 100)/lengthofFile); 
       Intent testIntent = new Intent(".MESSAGE_INTENT"); 
       testIntent.putExtra(PERCENTAGE, progressUpdate); 
       sendBroadcast(testIntent); 
      } 
      result = Activity.RESULT_OK; 
      fos.flush(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      if (stream != null) { 
       try { 
        stream.close(); 
        bis.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
      if (fos != null) { 
       try { 
        fos.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
     publishResults(output.getAbsolutePath(), result); 
    } 

    private void publishResults(String outputPath, int result) { 
     Intent intent = new Intent(".MESSAGE_INTENT"); 
     intent.putExtra(FILEPATH, outputPath); 
     intent.putExtra(RESULT, result); 
     sendBroadcast(intent); 
    } 

} 

,並呼籲這項服務,我會用:

Intent intent = new Intent(MainActivity.getAppContext(), DownloadService.class); 
intent.putExtra(DownloadService.FILENAME, downloadFileName[item]); 
intent.putExtra(DownloadService.URL, urlDownload[item]); 
MainActivity.getAppContext().startService(intent); 

現在這允許用戶下載一個文件的時間,但是如果用戶下載其他文件,第二個文件將不得不等待,直到第一文件完成下載。 現在發生在我的情況是: 1-首先下載FILE_1正在下載,並在狀態是說FILE_1。 2-用戶單擊一個新文件下載,狀態將第一個文件名更改爲第二個文件名,並等待FILE_1完成下載以啓動FILE_2,但活動下載從FILE_1更改爲FILE_2。

問題: 有沒有辦法爲多個文件多次調用DownloadService? 是否有可能解決我面臨的問題?將下載意圖服務視爲兩種不同的意圖?

UPDATE 我設法通過給每個文件的唯一詮釋ID來解決這個問題,每個ID將指向在其中顯示文件下載或排隊列表視圖的位置,然後我每個文件上工作很擁有。

回答

0

下面的代碼使用commons-io-2.4.jar庫,讓您的工作更輕鬆的處理低級別的數據移動,你會專注於法在手

URL someUrl = new URL("your url String"); // 
File someFile = new File("your file, where you want to save the data"); 
FileUtils.copyURLToFile(someUrl, someFile); 

,如果你想調用這個說法很少的時間從下載不同的文件服務器下面的代碼可能會給你一個想法,你可能想要做什麼,但你將不得不編寫它的等效代碼在Android上運行,你可能需要AsyncTask

import java.io.File; 
import java.io.IOException; 
import java.net.MalformedURLException; 
import java.net.URL; 

import org.apache.commons.io.FileUtils; 

public class DownloadTest { 

    public static void main(String[] args) { 

     Thread thread = new Thread(){ 
      @Override 
      public void run() { 
       // TODO Auto-generated method stub 
       super.run(); 
       try { 
        dowanloadFile(new URL("some url"), new File("some file")); 
       } catch (MalformedURLException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     }; 
     thread.start(); 


    } 

    private static void dowanloadFile(URL url, File file){ 
     try { 
      FileUtils.copyURLToFile(url, file); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
}