2015-07-10 86 views
0

我想在按下按鈕時從我的可繪製文件夾中顯示一些隨機圖像。如何減少Android中的內存使用量?

我叫我的照片「img_0」 ......以「img_51」

這是我的嘗試:

ImageView card1, card2, card3, card4, card5; 
Button bPlay; 

ArrayList<Integer> numbers = new ArrayList<Integer>(); 
Random randomGenerator = new Random(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
      WindowManager.LayoutParams.FLAG_FULLSCREEN); 

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 

    setContentView(R.layout.activity_play); 

    setReferences(); 
} 


private void setReferences() { 
    card1 = (ImageView) findViewById(R.id.card1); 
    card2 = (ImageView) findViewById(R.id.card2); 
    card3 = (ImageView) findViewById(R.id.card3); 
    card4 = (ImageView) findViewById(R.id.card4); 
    card5 = (ImageView) findViewById(R.id.card5); 
    bPlay = (Button) findViewById(R.id.bPlay2); 
    bPlay.setOnClickListener(this); 
} 

private void getRandomNumbers() { 
    while(numbers.size() < 5) { 
     int random = randomGenerator .nextInt(51); 
     if (!numbers.contains(random)) { 
      numbers.add(random); 
     } 
    } 
} 

private void clearArrayList() { 
    for(int i = numbers.size()-1 ; i >= 0; i--){ 
     numbers.remove(numbers.get(i)); 
    } 
} 

private void setBitmap(ImageView iv, int n) { 
    String str = "img_" + numbers.get(n); 

    int resID = getResources().getIdentifier(str, "drawable", getPackageName()); 
    iv.setImageResource(resID); 
} 

@Override 
public void onClick(View v) { 
    getRandomNumbers(); 

    setBitmap(card1, 0); 
    setBitmap(card2, 1); 
    setBitmap(card3, 2); 
    setBitmap(card4, 3); 
    setBitmap(card5, 4); 

    clearArrayList(); 
} 

我一直在尋找從仿真器的內存標籤,我看到內存使用率非常高...

如何減少內存使用量?只有當我按下一次它的按鈕,它有70和VM HEAP中的東西。

任何想法都非常受歡迎!

我也試圖與位圖和回收,但它給我的錯誤。應用已停止工作......

這裏是我的嘗試:

private void setBitmap(ImageView iv, int n) { 
     String str = "img_" + numbers.get(n); 
     Bitmap bitmap = BitmapFactory.decodeResource(getResources(), getResourceID(str, "drawable", 
       this)); 
     iv.setImageBitmap(bitmap); 
     bitmap.recycle(); 
    } 

這裏是logcat的:

07-10 16:57:10.402 1906-1906/? I/art﹕ Not late-enabling -Xcheck:jni (already on) 
07-10 16:57:14.321 1906-1937/com.symplyfyweb.gherghina.oldschoolwesternpoker D/OpenGLRenderer﹕ Use EGL_SWAP_BEHAVIOR_PRESERVED: true 
07-10 16:57:14.335 1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker D/﹕ HostConnection::get() New Host Connection established 0xb4a93f40, tid 1906 
07-10 16:57:14.349 1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker D/Atlas﹕ Validating map... 
07-10 16:57:14.813 1906-1937/com.symplyfyweb.gherghina.oldschoolwesternpoker D/﹕ HostConnection::get() New Host Connection established 0xb4b270b0, tid 1937 
07-10 16:57:14.957 1906-1937/com.symplyfyweb.gherghina.oldschoolwesternpoker I/OpenGLRenderer﹕ Initialized EGL, version 1.4 
07-10 16:57:15.032 1906-1937/com.symplyfyweb.gherghina.oldschoolwesternpoker D/OpenGLRenderer﹕ Enabling debug mode 0 
07-10 16:57:15.054 1906-1937/com.symplyfyweb.gherghina.oldschoolwesternpoker W/EGL_emulation﹕ eglSurfaceAttrib not implemented 
07-10 16:57:15.063 1906-1937/com.symplyfyweb.gherghina.oldschoolwesternpoker W/OpenGLRenderer﹕ Failed to set EGL_SWAP_BEHAVIOR on surface 0xb4b23b00, error=EGL_SUCCESS 
07-10 16:57:15.169 1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker I/Choreographer﹕ Skipped 38 frames! The application may be doing too much work on its main thread. 
07-10 16:57:16.748 1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker I/Choreographer﹕ Skipped 93 frames! The application may be doing too much work on its main thread. 
07-10 16:57:22.533 1906-1937/com.symplyfyweb.gherghina.oldschoolwesternpoker W/EGL_emulation﹕ eglSurfaceAttrib not implemented 
07-10 16:57:22.533 1906-1937/com.symplyfyweb.gherghina.oldschoolwesternpoker W/OpenGLRenderer﹕ Failed to set EGL_SWAP_BEHAVIOR on surface 0xb4b23cc0, error=EGL_SUCCESS 
07-10 16:57:23.378 1906-1913/com.symplyfyweb.gherghina.oldschoolwesternpoker W/art﹕ Suspending all threads took: 19.779ms 
07-10 16:57:28.898 1906-1913/com.symplyfyweb.gherghina.oldschoolwesternpoker W/art﹕ Suspending all threads took: 12.510ms 
07-10 16:57:31.940 1906-1918/com.symplyfyweb.gherghina.oldschoolwesternpoker I/art﹕ Clamp target GC heap from 66MB to 64MB 
07-10 16:57:32.352 1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker I/art﹕ Alloc sticky concurrent mark sweep GC freed 8(432B) AllocSpace objects, 0(0B) LOS objects, 1% free, 62MB/64MB, paused 1.468ms total 17.160ms 
07-10 16:57:32.378 1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker I/art﹕ Clamp target GC heap from 66MB to 64MB 
07-10 16:57:32.378 1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker I/art﹕ Alloc partial concurrent mark sweep GC freed 14(576B) AllocSpace objects, 0(0B) LOS objects, 1% free, 62MB/64MB, paused 889us total 19.090ms 
07-10 16:57:32.444 1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker I/art﹕ Clamp target GC heap from 66MB to 64MB 
07-10 16:57:32.444 1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker I/art﹕ Alloc concurrent mark sweep GC freed 8(12KB) AllocSpace objects, 0(0B) LOS objects, 1% free, 62MB/64MB, paused 789us total 57.650ms 
07-10 16:57:32.451 1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker I/art﹕ Forcing collection of SoftReferences for 12MB allocation 
07-10 16:57:32.501 1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker I/art﹕ Clamp target GC heap from 66MB to 64MB 
07-10 16:57:32.502 1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker I/art﹕ Alloc concurrent mark sweep GC freed 11(288B) AllocSpace objects, 0(0B) LOS objects, 1% free, 62MB/64MB, paused 799us total 49.442ms 
07-10 16:57:32.507 1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker E/art﹕ Throwing OutOfMemoryError "Failed to allocate a 13068012 byte allocation with 1263808 free bytes and 1234KB until OOM" 
07-10 16:57:32.524 1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker I/art﹕ Alloc sticky concurrent mark sweep GC freed 5(448B) AllocSpace objects, 0(0B) LOS objects, 1% free, 62MB/64MB, paused 731us total 14.526ms 
07-10 16:57:32.550 1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker I/art﹕ Clamp target GC heap from 66MB to 64MB 
07-10 16:57:32.551 1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker I/art﹕ Alloc partial concurrent mark sweep GC freed 10(376B) AllocSpace objects, 0(0B) LOS objects, 1% free, 62MB/64MB, paused 954us total 19.113ms 
07-10 16:57:32.664 1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker I/art﹕ Clamp target GC heap from 66MB to 64MB 
07-10 16:57:32.665 1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker I/art﹕ Alloc concurrent mark sweep GC freed 3(96B) AllocSpace objects, 0(0B) LOS objects, 1% free, 62MB/64MB, paused 1.193ms total 108.749ms 
07-10 16:57:32.675 1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker W/art﹕ Suspending all threads took: 9.507ms 
07-10 16:57:32.675 1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker I/art﹕ Forcing collection of SoftReferences for 12MB allocation 
07-10 16:57:32.770 1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker I/art﹕ Clamp target GC heap from 66MB to 64MB 
07-10 16:57:32.770 1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker I/art﹕ Alloc concurrent mark sweep GC freed 3(96B) AllocSpace objects, 0(0B) LOS objects, 1% free, 62MB/64MB, paused 11.517ms total 93.336ms 
07-10 16:57:32.775 1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker E/art﹕ Throwing OutOfMemoryError "Failed to allocate a 13068012 byte allocation with 1263992 free bytes and 1234KB until OOM" 
07-10 16:57:32.777 1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker D/skia﹕ --- allocation failed for scaled bitmap 
07-10 16:57:32.779 1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker D/AndroidRuntime﹕ Shutting down VM 
    --------- beginning of crash 
07-10 16:57:32.802 1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.symplyfyweb.gherghina.oldschoolwesternpoker, PID: 1906 
    java.lang.OutOfMemoryError: Failed to allocate a 13068012 byte allocation with 1263992 free bytes and 1234KB until OOM 
      at dalvik.system.VMRuntime.newNonMovableArray(Native Method) 
      at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) 
      at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:609) 
      at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:444) 
      at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:467) 
      at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:497) 
      at com.symplyfyweb.gherghina.oldschoolwesternpoker.PlayActivity.setBitmap(PlayActivity.java:97) 
      at com.symplyfyweb.gherghina.oldschoolwesternpoker.PlayActivity.onClick(PlayActivity.java:112) 
      at android.view.View.performClick(View.java:4780) 
      at android.view.View$PerformClick.run(View.java:19866) 
      at android.os.Handler.handleCallback(Handler.java:739) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.app.ActivityThread.main(ActivityThread.java:5257) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:372) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
+0

可以使用BitmapFactory.decodeResource:http://tinyurl.com/2f3rba7,並在您不需要時在創建的位圖上調用回收。 (回收在堆中釋放數據)。 http://developer.android.com/reference/android/graphics/Bitmap.html#recycle() – krystian71115

+0

我已經編輯了位圖工廠方法的帖子..但它給了我錯誤 –

+0

在clearArrayList中執行此操作並將clearArrayList點擊頂部。 – krystian71115

回答

1

你應該真的緩存你的圖像,以便他們只需要加載一次。

這將是非常簡單的,所有你需要做的就是當你去加載一個位圖時,檢查它是否已經在緩存中,然後是否使用它。如果它不是,然後加載圖像。這會阻止您多次加載資源。

0
// create second array list: 
ArrayList<Bitmap> bitmaps = new ArrayList<Bitmap>(); 
private void clearArrayList() { 
    numbers.clear(); 
    for(Bitmap bitmap : bitmaps) 
    { 
     bitmap.recycle(); 
    } 
    bitmaps.clear(); 
} 

@Override 
public void onClick(View v) { 
    clearArrayList(); 
    getRandomNumbers(); 

    setBitmap(card1, 0); 
    setBitmap(card2, 1); 
    setBitmap(card3, 2); 
    setBitmap(card4, 3); 
    setBitmap(card5, 4); 
} 

編輯:

private void setBitmap(ImageView iv, int n) { 
     String str = "img_" + numbers.get(n); 
     Bitmap bitmap = BitmapFactory.decodeResource(getResources(), getResourceID(str, "drawable", 
       this)); 
     iv.setImageBitmap(bitmap); 
     bitmaps.add(bitmap); 
    } 
+0

以及如何使用位圖arraylist? –

+0

@xyz我只爲clearArrayList方法創建了位圖數組列表。 – krystian71115

+0

@xyz位圖添加在setBitmap中,當用戶單擊按鈕時釋放前面的位圖(和免費數據) – krystian71115

0

而且回收的位圖,有一件事,可以真正幫助是不加載一個全尺寸的位圖,如果你不需要它。例如,如果您嘗試加載使用設備相機拍攝的圖像,則它們的分辨率可能會高於您無論如何在顯示器上顯示的分辨率(例如,全尺寸圖像可能爲2000 x 20000像素,您可能試圖將其顯示在500 x 500像素的ImageView中)。全尺寸位圖將佔用更多的內存空間,實際上,在縮小尺寸的圖像視圖上顯示時,您將丟棄許多像素。

試試這個SO帖子以瞭解如何減少位圖的內存佔用是否會顯示在ImageView的是不是一樣大的全尺寸圖像:

How to scale bitmap to screen size?