2013-02-23 153 views
0

我想寫一個應用程序,顯示來自切諾基網絡服務器的圖像。我用下面的代碼下載圖像:如何在Android上下載圖片時顯示圖片預覽?

@Override 
protected Bitmap doInBackground(URL... params) { 
    URL urlToDownload = params[0]; 
    String downloadFileName = urlToDownload.getFile(); 
    downloadFile = new File(applicationContext.getCacheDir(), downloadFileName); 
    new File(downloadFile.getParent()).mkdirs(); // create all necessary folders 

    // download the file if it is not already cached 
    if (!downloadFile.exists()) { 
     try { 
      URLConnection cn = urlToDownload.openConnection(); 
      cn.connect(); 
      cn.setReadTimeout(5000); 
      cn.setConnectTimeout(5000); 
      InputStream stream = cn.getInputStream(); 

      FileOutputStream out = new FileOutputStream(downloadFile); 
      byte buf[] = new byte[16384]; 
      int numread = 0; 
      do { 
       numread = stream.read(buf); 
       if (numread <= 0) break; 
       out.write(buf, 0, numread); 
      } while (numread > 0); 
      out.close(); 
     } catch (FileNotFoundException e) { 
      MLog.e(e); 
     } catch (IOException e) { 
      MLog.e(e); 
     } catch (Exception e) { 
      MLog.e(e); 
     } 
    } 

    if (downloadFile.exists()) { 
     BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inSampleSize = 16; 
     return BitmapFactory.decodeFile(downloadFile.getAbsolutePath(), options); 
    } else { 
     return null; 
    } 
} 

這工作,但因爲我需要下載的圖像是相當大(多兆字節)需要一定的時間,直到用戶可以看到任何東西。

我想在加載完整圖像時顯示圖像的低分辨率預覽(就像任何Webbrowser一樣)。我怎樣才能做到這一點? BitmapFactory似乎只接受完全加載的文件或在解碼之前完全下載的流。

服務器上只有高分辨率圖像。我只想顯示下載時已下載的圖像的所有內容,以便在圖像完全下載之前顯示(部分)圖像。這樣用戶可以在他看到這不是他正在尋找的圖片時立即終止下載。

回答

0

那麼最簡單的方法就是下載兩張圖片。一個是小的(比方說幾個字節),然後在後臺加載較大的圖像時將其擴展(看起來很糟糕,但會給出進度的概念)。小小的人很可能會先回來,並且可以讓它看起來好像是從低分辨率到高分辨率。

+0

不幸的是,我無法對服務器進行任何更改。 – hin 2013-02-23 16:47:39

+0

Android不支持漸進式jpeg,但不確定是否可以讓解碼器解碼部分。最有可能的方法是將原始圖像保存到文件中,然後嘗試執行並異步讀取。這樣,如果它是一個漸進的JPEG,你*可能會得到一個部分解碼。但是,由於您無法更改服務器組件,因此無論您正在抓取哪個網站,都無法投放漸進式jpeg。可能更好地顯示填充的進度指示器 – 2013-02-28 00:06:58

0

2 AsyncTask呢? 第一個下載小圖或低分辨率圖像並在ImageView上顯示它之後,第一個AsyncTask調用第二個AsyncTask下載全分辨率圖像。

+0

不幸的是,我無法對服務器進行任何更改。此服務器上沒有小尺寸圖像。我只想顯示下載過程中已下載的所有圖片。就像任何網頁瀏覽器在您打開大圖片時所做的一樣。 – hin 2013-02-24 15:46:08