Note that there are some explanatory texts on larger screens.

plurals
  1. POandroid - OutofMemoryError - bitmap size exceeds VM budget - on orientation change
    primarykey
    data
    text
    <p>I have just started using Android. I have tried an apps with orientation change. </p> <p>I am facing bitmap size exceeds VM budget. Have gone through many post in stackoverflow and could not figure out the problem. Exception is throwing at setContentView(R.layout.level1); in onCreate. This is happening when I change the orientation.</p> <p>I have tried all forums and stackoverflow but could not figure it out. Trying to fix this for past 3 days.</p> <p>Below class is being called from another activity on button click using intent and startActivity.</p> <pre><code>@Override public void onCreate(Bundle savedInstanceState) { Log.d("onCreate", "onCreate"); super.onCreate(savedInstanceState); setContentView(R.layout.level1); if(!isOrientationChanged) //this part is executed if orientation is not changed (activity starts as usual) { drawableList = new ArrayList&lt;Drawable&gt;(); drawableList.add( getResources().getDrawable(colorEnum[0])); drawableList.add( getResources().getDrawable(colorEnum[1])); } isOrientationChanged = false; timeView = (TextView) findViewById(R.id.timeView); colorButton = (Button) findViewById(R.id.game_button); } @Override protected void onResume() { scoreView = (TextView) findViewById(R.id.scoreView); scoreView.setText("Score: " + score); hand.postDelayed(runThread, 0); super.onResume(); } @Override public Object onRetainNonConfigurationInstance() { isOrientationChanged = true; return null; //as you are not returning an object you are not leaking memory here } @Override protected void onPause() { hand.removeCallbacks(runThread); super.onPause(); } @Override protected void onDestroy() { super.onDestroy(); unbindDrawables(findViewById(R.id.RootView)); System.gc(); } private void unbindDrawables(View view) { if (view.getBackground() != null) { view.getBackground().setCallback(null); } if (view instanceof ViewGroup) { for (int i = 0; i &lt; ((ViewGroup) view).getChildCount(); i++) { Log.d("onDestroy","Inside loop to getting child "+((ViewGroup) view).getChildAt(i)); unbindDrawables(((ViewGroup) view).getChildAt(i)); } ((ViewGroup) view).removeAllViews(); } hand.removeCallbacks( runThread); } /** The run thread. */ Thread runThread = new Thread() { @Override public void run() { timeView.setText("Time Left: " + timeLeftVal); : : : } else { changeColor(); : : hand.postDelayed(runThread, GET_DATA_INTERVAL); } } }; /** * Change color. */ private void changeColor() { colorButton.setBackgroundDrawable(drawableList.get(randomNum)); </code></pre> <p>}</p> <ol> <li>In onCreate method, creating a drawable list and initializing it on first load.</li> <li>Using Thread to set the button image background randomly</li> <li>Calling unbindDrawables() method onDestroy so that on orientation change old view will be removed from memory.</li> <li>hand.removeCallbacks(runThread) is also being called in onPause method</li> <li>returned null in onRetainNonConfigurationInstance() </li> </ol> <hr> <p>I have fixed the problem. Small mistake resulted in this big issue. I have used Thread instead of Runnable in Handler. Hence, removeCallback didn't work as expected. </p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload