Я только начал использовать 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));
}
- В методе onCreate создание списка для рисования и его инициализация при первой загрузке.
- Использование Thread для произвольной установки фона изображения кнопки
- Вызов метода unbindDrawables () onDestroy для изменения ориентации старого представлениябыть удаленным из памяти.
- hand.removeCallbacks (runThread) также вызывается в методе onPause
- возвращает ноль в onRetainNonConfigurationInstance ()
У меня естьисправил проблему.Маленькая ошибка привела к этой большой проблеме.Я использовал Thread вместо Runnable в обработчике.Следовательно, removeCallback не работал должным образом.