2013-10-21 92 views
1

我需要通過URL加載圖像,在ImageView中設置並將文件保存在SD卡中。使用java.net.URL緩慢下載JPG

該類做到這一點,但很慢....的JPG文件具有60KB和下載其3〜6秒我10Mbps的互聯網連接的時間...

我用這加載任何圖像在ListView ...

公共類DownloadImageTask擴展的AsyncTask {

ImageView bmImage; 
String path; 
String filename = "pg0.rsc"; 
String param; 
Context context; 

public DownloadImageTask(Context context, ImageView bmImage, String param, String code) { 
    this.bmImage = bmImage; 
    this.param = param; 
    this.path = Environment.getExternalStorageDirectory().toString() + "/.RascunhoCache/." + code + "/"; 
    this.context = context; 
} 

protected Bitmap doInBackground(String... urls) { 
    String urldisplay = urls[0]; 
    Bitmap mIcon11 = null; 
    try { 
     InputStream in = new java.net.URL(urldisplay).openStream(); 
     mIcon11 = BitmapFactory.decodeStream(in); 
    } catch (Exception e) { 
     Log.e("Error", e.getMessage()); 
     e.printStackTrace(); 
    } 
    return mIcon11; 
} 

protected void onPostExecute(Bitmap result) {  
    bmImage.setImageBitmap(result); 
    if(param.equals("c")){ 
     OutputStream outStream = null; 
     new File(path).mkdirs(); 
     File file = new File(path, filename); 
     try { 
     outStream = new FileOutputStream(file); 
     result.compress(Bitmap.CompressFormat.JPEG, 100, outStream); 
     outStream.flush(); 
     outStream.close(); 
     } 
     catch(Exception e){} 
    } 
} 

}

回答

1

,不要將數據直接進行解碼。首先將其存儲在磁盤上。

假設jpeg解碼需要在數據流中向前和向後解碼圖像。你想象會有多慢(甚至在某些情況下不可能)?

使用來自apache的IOUtils來幫助您處理流和文件。

看看你的帖子執行方法。這將在主線程上執行,凍結用戶界面,而您的代碼將被執行。我們使用AsyncTask來操作位圖,但我們這樣做是爲了減輕UI線程,所以在doInBackground中執行任何編碼/解碼/冗長的操作。

而且,在你的catch子句中做些東西,將它們留空是一種非常糟糕的做法:你的應用程序沒有機會知道出了什麼問題。它需要恢復,或者至少告訴你的用戶,或者記錄一些東西。

最後,你應該看看this thread,比網絡上的asynctask有更好的方法,一些相當不錯的庫可以幫助很多。

+0

謝謝你。現在它在1〜2秒內加載:) –

+0

因此,接受答案(並投票):) – Snicolas