2013-07-21 53 views
2

我已經寫了一個按鈕的代碼,讓我從應用程序中的活動轉移到主要活動。但在運行期間發生錯誤:如何轉到主要活動

07-21 09:28:13.864:E/dalvikvm-heap(371):25165824字節外部分配對於此進程來說過大。 07-21 09:28:13.864:E/GraphicsJNI(371):VM不會讓我們分配25165824字節

我已經使用了一個圖像並將它們存儲在我的數據庫中,但沒有任何回收是這個問題嗎? 這裏是我的代碼位:

try { 
      Log.d("to get image", "ok"); 
      ImageView imageView = (ImageView) rowView.findViewById(R.id.imageView1); 
      Bitmap bitmap = BitmapFactory.decodeStream((InputStream)new URL(imageInfo.get(position)).getContent()); 
      imageView.setImageBitmap(bitmap); 
      } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     } 

我的應用程序想取回來自YouTube的默認圖像的任何關鍵搜索詞,並將它們存儲在我的數據庫。

+0

是你的圖片尺寸大嗎? – KOTIOS

+0

發佈代碼片段。 – 2013-07-21 09:53:20

+1

我的圖像是任何YouTube視頻的默認圖像,所以有一個大的和小的 – Tolen

回答

0

此錯誤表示您的圖像太大。這裏的問題是,你得到了內存泄漏。如果您使用位圖,最好的方法是使用適合多個設備的小型位圖。如果你使用位圖,如果這個位圖不再使用,也調用recycle()。我建議通過這一指南閱讀使用位圖:

http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

此外,還有一個選擇,如果回收是不可能的你。您可以縮放你的位圖到你需要置身於另一個線程在計算器完全解釋在這裏:

Strange out of memory issue while loading an image to a Bitmap object

+0

不幸的是我會再次使用位圖。 – Tolen

+0

當然,但只有當你再次開始主要活動,或者?所以在每一次開始時,再次創建這個位圖,在每次完成時,都要回收這個圖像。 – Opiatefuchs

+0

Opiatefuchs:非常感謝你,我錯過了,並會嘗試它謝謝。 – Tolen

0

Android應用程序有一個有限的堆大小(最小的舊設備是小到16MB)。這根據設備而異,所以在質量保證期間要小心。由於位圖每個像素可能需要多達4個字節,因此大型位圖可以輕鬆填滿您的堆(1000 x 1000像素= 3.8MB)。你的位圖似乎需要25MB,這是巨大的!

這意味着,你必須非常小心,並使用一些策略來避免浪費內存:

  1. 當你不需要再位圖,它釋放並調用bitmap.recycle()以確保內存立即釋放。如果將來再次需要位圖,則可以從磁盤/資源再次加載該位圖。

  2. 如果位圖大於屏幕尺寸,可以縮小尺寸以節省內存。技術here將允許您加載它最初減少2/3/4 ..如果您需要更多的微調,您可以加載它的全尺寸,然後使用Bitmap.createScaledBitmap重新調整。只要不要忘記recycle()立即原來的大位圖。

請注意,對於位圖縮放,我不建議只調整源圖像的大小。不同的Android設備有不同的分辨率。所以我會保持我的源圖像足夠大,以在可用的最高分辨率設備上看起來很完美。低分辨率設備通常具有較少的堆內存,因此運行時縮放需要處理這些內存。

+0

talkol:非常感謝你。 – Tolen

+0

當然:)接受答案,如果它幫助你 – talkol

+0

talkol:這將是一種樂趣:) – Tolen