android - OutofMemoryError - размер растрового изображения превышает бюджет виртуальной машины - при изменении ориентации - PullRequest
2 голосов
/ 09 декабря 2011

Я только начал использовать Android.Я пробовал приложения с изменением ориентации.

У меня размер растрового изображения превышает бюджет виртуальной машины.Перебрал много постов в stackoverflow и не смог разобраться в проблеме.Исключение выдает в setContentView (R.layout.level1);в onCreate.Это происходит, когда я меняю ориентацию.

Я перепробовал все форумы и stackoverflow, но не смог понять это.Попытка исправить это за последние 3 дня.

Ниже вызывается класс из другого действия по нажатию кнопки с использованием намерения и startActivity.

@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<Drawable>();
      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 < ((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));

}

  1. В методе onCreate создание списка для рисования и его инициализация при первой загрузке.
  2. Использование Thread для произвольной установки фона изображения кнопки
  3. Вызов метода unbindDrawables () onDestroy для изменения ориентации старого представлениябыть удаленным из памяти.
  4. hand.removeCallbacks (runThread) также вызывается в методе onPause
  5. возвращает ноль в onRetainNonConfigurationInstance ()

У меня естьисправил проблему.Маленькая ошибка привела к этой большой проблеме.Я использовал Thread вместо Runnable в обработчике.Следовательно, removeCallback не работал должным образом.

1 Ответ

0 голосов
/ 14 декабря 2011

Надеюсь, что следующие ссылки помогут:

Eclipse Memory Analyzer-Статья

Youtube видео

Поиск Google: "Управление памятью Google IO 2011 для приложений Android"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...