2011-07-08 42 views
0

我在下面的代碼中得到了MalformedURLexception,並且我不知道導致它的原因。程序死機,同時在android中下載文件

public void down(String url) 
    {  try { 
     URL url1 = new URL(url); 


     HttpURLConnection urlConnection = (HttpURLConnection) url1.openConnection(); 
     urlConnection.setRequestMethod("GET"); 
     urlConnection.setDoOutput(true); 
     urlConnection.connect(); 
     File SDCardRoot = Environment.getExternalStorageDirectory(); 
     //create a new file, specifying the path, and the filename 
     //which we want to save the file as. 
     File file = new File(SDCardRoot,"somefile.ext"); 


     FileOutputStream fileOutput = new FileOutputStream(file); 

     InputStream inputStream = urlConnection.getInputStream(); 

     int totalSize = urlConnection.getContentLength(); 
     int downloadedSize = 0; 

     byte[] buffer = new byte[1024]; 
     int bufferLength = 0; //used to store a temporary size of the buffer 

     while ((bufferLength = inputStream.read(buffer)) > 0) { 

       fileOutput.write(buffer, 0, bufferLength); 
       //add up the size so we know how much is downloaded 
       downloadedSize += bufferLength; 
       //report progress 


     } 

     fileOutput.close(); 


    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 

    } 
    } 
} 

它說未知的協議。 連接完全正常,直到讀取部分出現, 之前的代碼是甚至打印正確的文件大小。 此外,我想下載的文件有一個像 http://download12.aomethin.com/blaa-blaa url如果我嘗試添加www,請求開始重定向。 雖然我認爲這可能是一個不好意思,但我也想知道如何獲得這個文件的名稱,並保存該名稱而不是我選擇的文件名。

編輯:該程序正在工作,現在我只需要知道如何得到該文件的正確名稱。並將其作爲後臺進程。

+0

@Home是不是錯了我是正確的,現在加入堆棧跟蹤... – Arveen

+0

@ rigy73哪裏是你的堆棧跟蹤? – IamAlexAlright

+0

@Alex嘿,我再次嘗試,程序正在工作,該文件正在下載,但正如這種情況發生應用程序似乎掛起。我如何改變這一點。 – Arveen

回答

0

在主線程下載不是一個好習慣;你應該在新的線程上實現它;因爲在下載時,主線程忙於下載文件。如果等待時間超出預期,系統將生成「無響應」錯誤。

爲了做到這一點,你可以使用「TaskAsync」或「IntentService」,甚至可以製作一個新的線程。不過,我建議[TaskAsync],因爲它很容易實現。

這裏是一個很好的做法,設置文件名自己:

public void downloadClicked() { 
    InputStream in = null; 
    FileOutputStream f = null;  
    try { 
     String path ="ftp://administrator:[email protected]:21/MyShedule.zip"; 
     String targetFileName = "MyShedule.zip"; 

     URL u = new URL(path); 
     URLConnection c = u.openConnection();   

     c.setDoOutput(true); 
     c.connect(); 
     String string = Environment.getExternalStorageDirectory().getPath().toString(); 

     in = c.getInputStream(); 

     f = new FileOutputStream(new File(string +"/kidsLibrary/"+ targetFileName)); 

     IOUtils.copy(in, f); 

     } catch (MalformedURLException e) { 
      Toast.makeText(KidsLibrary.this, e.toString(), Toast.LENGTH_LONG) 
      .show();    
     } catch (ProtocolException e) {   
      Toast.makeText(KidsLibrary.this, e.toString(), Toast.LENGTH_LONG) 
      .show(); 
     } catch (FileNotFoundException e) {   
      Toast.makeText(KidsLibrary.this, e.toString(), Toast.LENGTH_LONG) 
      .show(); 
     } catch (IOException e) {   
      Toast.makeText(KidsLibrary.this, e.toString(), Toast.LENGTH_LONG) 
      .show(); 
    } finally { 
      IOUtils.closeQuietly(in); 
      IOUtils.closeQuietly(f); 
     } 
}