2012-11-09 50 views
2

我使用720X1136大小的圖像作爲我的應用程序的啓動屏幕,僅用於Samsung Galaxy Nexus手機。實際文件大小爲513Kb(從瀏覽器中找到)。當活動調用onCreate方法並設置內容視圖時,日誌提到內存分配爲13.5 MB。在android中加載圖像分配大內存

這是我在後臺加載圖片的活動。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:orientation="vertical"> 

     <ImageView android:src="@drawable/splashscreen" 
       android:id="@+id/splashscreen" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       /> 

     <WebView xmlns:android="http://schemas.android.com/apk/res/android" 
        android:visibility="invisible" 
       android:id="@+id/webview" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
     /> 

</RelativeLayout> 

如何減少此內存分配?

由於

+0

在relativelayout中使用它作爲背景可能會爲您節省一些內存... –

+0

您可以嘗試完成使用後的啓動畫面活動。 – dumbfingers

+0

你需要設置圖像的代碼到你的根佈局像我在android中給出的。 – Herry

回答

0

13MB是精細和範圍內。每當此啓動畫面消失時,位圖將被回收,內存將重新用於其他應用程序。

你可以用來儘量減少這種記憶足跡的技巧是:

。使用9補丁來拉伸圖像的邊界(如果設計允許的話)

。降低圖像的質量(它看起來廢話)

2

使用@繪製/閃屏此圖片爲9補丁圖像 那麼這將減少內存分配

0

沒有人需要像素完美的閃屏,您可以輕鬆地將圖像尺寸減小到原來的一半,這將爲您節省3/4的內存佔用空間。

在另一個說明中,我建議儘量避免使用啓動畫面,下面是關於此主題的一篇很好的文章:"Splash screens are evil, don’t use them!",否則,您可能會搜索谷歌「閃屏是邪惡的」並獲得更多反對使用它們的論點。

1

以下是解決問題的步驟。

mRelativeLayout=(RelativeLayout)findViewById(R.id.relative_view); 
     intializeScreenSize(); 

     mBitmap=decodeSampledBitmapFromResource(getResources(),R.drawable.splash_background,width,height); 
     mDrawable=new BitmapDrawable(getResources(), mBitmap); 
     mRelativeLayout.setBackgroundDrawable(mDrawable); 




public static Bitmap decodeSampledBitmapFromResource(Resources res, 
      int resId, int reqWidth, int reqHeight) { 

     // First decode with inJustDecodeBounds=true to check dimensions 
     final BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inJustDecodeBounds = true; 
     BitmapFactory.decodeResource(res, resId, options); 

     // Calculate inSampleSize 
     options.inSampleSize = calculateInSampleSize(options, reqWidth, 
       reqHeight); 

     // Decode bitmap with inSampleSize set 
     options.inJustDecodeBounds = false; 
     return BitmapFactory.decodeResource(res, resId, options); 
    } 



    public void intializeScreenSize(){ 

     DisplayMetrics displaymetrics = new DisplayMetrics(); 
     getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); 
     height= displaymetrics.heightPixels; 
     width= displaymetrics.widthPixels; 
    } 


    public static int calculateInSampleSize(BitmapFactory.Options options, 
      int reqWidth, int reqHeight) { 
     // Raw height and width of image 
     final int height = options.outHeight; 
     final int width = options.outWidth; 
     int inSampleSize = 1; 

     if (height > reqHeight || width > reqWidth) { 
      if (width > height) { 
       inSampleSize = Math.round((float) height/(float) reqHeight); 
      } else { 
       inSampleSize = Math.round((float) width/(float) reqWidth); 
      } 
     } 
     return inSampleSize; 
    } 

這裏有一些與Android中的加載位圖相關的鏈接。 SO Answer Load Bitmap Efficiently

0

由於Alex Orlov表示:「磁盤上的大小無關,在內存位圖的尺寸在圖像壓縮第一種情況下,位圖,在另一方面,僅僅是一個原始集。的像素「。然而,即使考慮到它被存儲爲原始圖像,20MB仍然太多了。如果我們考慮每個像素4B,那將會是5Mpix圖片,但是您發佈的圖片明顯更小。

我有類似的問題:我正在加載一個原始格式爲8MB的圖像,但是,爲它分配了32MB。後來我發現這是由dpi縮放引起的。如果您的圖像位於「可繪製」文件夾中,則會根據當前的屏幕dpi自動縮放圖像。我有一個XHDPI屏幕,所以我的圖像水平縮放2倍,垂直縮放2倍,這就是爲什麼它需要4倍的內存。

你可以找到更多有關dpi的是如何在這裏工作:http://developer.android.com/guide/practices/screens_support.html

如果你不想使用這種自動機器人的功能和規模的圖像你自己,只需重命名你的「繪製」文件夾「可繪-nodpi」。標記爲「nodpi」的「drawable」文件夾中的所有圖像將按原樣加載。