2011-08-19 16 views
1

我有一個Android圖庫小部件,它可以顯示來自網絡的圖片的幾個ImageViews。圖像以jpgs存儲,並在添加到ImageViews之前轉換爲位圖。每個jpg都是8kb。我沒有對圖像進行任何縮放。Android:Gallery Widget性能糟糕,有什麼原因?

當我使用帶有1或2張圖片的圖庫時,它可以正常工作,滾動是平滑的等等。隨着3,它開始變得有點波濤洶涌,並且在5或10張圖片中,應用程序幾乎不可用。

有沒有人有任何想法,爲什麼表現如此糟糕?有沒有人有替代方案的建議?謝謝你 -

@elevine:我的方法來構建從JPG網址位:

private Bitmap getBitmapFromURL(String input) throws IOException { 
     URL url = new URL(input); 
     URLConnection conn = url.openConnection(); 
     conn.connect(); 
     InputStream is = conn.getInputStream(); 
     BufferedInputStream bis = new BufferedInputStream(is); 
     Bitmap bm = BitmapFactory.decodeStream(bis); 
     bis.close(); 
     is.close(); 
     return bm; 
    } 

這是從我的ImageAdapter我getView方法。我開始懷疑這是我問題所在的地方......我是否多次抓取圖像?謝謝你的幫助!

public View getView(int position, View convertView, ViewGroup parent) { 
      ImageView imageView = new ImageView(mContext); 

      Bitmap bm; 
      try { 
       imageView.setImageBitmap(getBitmapFromURL(urls.get(position))); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      //mageView. 
      imageView.setScaleType(ImageView.ScaleType.FIT_CENTER); 
      imageView.setLayoutParams(new Gallery.LayoutParams(100,100)); 
      return imageView; 
     } 
+0

你是如何載入「網絡圖片」的? – elevine

+0

這看起來很亂,在原來的問題中發佈代碼: – deakolt

+0

你可以顯示你在哪裏調用getBitmapFromURL嗎? – elevine

回答

1

如果您從您的Activity中調用getBitmapFromURL,那麼它可能會阻塞UI線程。確保此代碼在單獨的線程上或在AsyncTask中運行。您也可能想要將Bitmap緩存在WeakHashmap中。在從網絡抓取緩存之前檢查緩存中的圖像。

+0

謝謝!我認爲這是問題。我將下載並緩存後臺線程中的所有圖像,然後在getView()中簡單地從緩存中獲取圖像。 – deakolt

+0

是。工作喜歡魅力,再次感謝。 – deakolt

1

下面是一些提示itthat可能出現派上用場:

  • 首先嚐試緩存與內存的WeakReference形象,也對磁盤(如果可能),因此您不必在下載浪費資源流動圖像重新一遍。
  • 如果您重寫GalleryAdapter並且您沒有幫助適配器回收您的視圖,性能可能會很差列出項目
  • 也嘗試在不同的線程上執行下載操作,請考慮使用AsyncTask。

這裏有一個有趣ImageManager您可能需要使用其他

+0

我認爲你是現貨;我認爲我正在重新下載圖片方式,並且使用UI線程來做 - 我要試着緩存圖片。 – deakolt

+0

你的答案基本上是正確的,我很抱歉,我無法贊成或標記爲正確的(其他人先幫助我),但謝謝你! – deakolt

+0

10-4,保持乾淨!(你的代碼) – Necronet

1

一個項目需要考慮的是animationDuration。您可以將其設置爲0,這將有助於滾動性能。我最近需要使用正在處理的Google TV應用來完成此操作,否則會暫停一兩次。還建議預先緩存圖像,並儘可能減少一次顯示的圖像數量。

相關問題