Недостаточно памяти для отображения AlertDialog и изменения ориентации - PullRequest
0 голосов
/ 11 мая 2011

У меня есть действие, содержащее две кнопки изображений. Если пользователь щелкает обратно, отображается alertDialog. Когда отображается предупреждение, если ориентация меняется несколько раз назад и вперед, приложение вылетает с таким сообщением:

ERROR/dalvikvm-heap(10988): 3363556-byte external allocation too large for this process.
ERROR/dalvikvm(10988): Out of memory: Heap Size=4935KB, Allocated=2594KB, Bitmap Size=19579KB ERROR/GraphicsJNI(10988): VM won't let us allocate 3363556 bytes

Если AlertDialog не существует, приложение не падает.

public class StartPageView extends Activity implements OnClickListener, android.content.DialogInterface.OnClickListener
{
    private static final String TAG = "StartPageView";
    private ImageButton vacButton;
    private ImageButton sickButton;
    private AlertDialog alert;
    private static boolean alertDismissedByLifeCycle = false;


@Override
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.startpage);

    vacButton = (ImageButton)findViewById(R.id.gotovac_btn);
    vacButton.setOnClickListener(this);

    sickButton = (ImageButton)findViewById(R.id.gotosick_btn);
    sickButton.setOnClickListener(this); 

    if(alertDismissedByLifeCycle)
    {
        alertDismissedByLifeCycle = false;
        showAlert();
    }
}

@Override
protected void onStop() 
{
    if(alert != null && alert.isShowing())
    {
        alertDismissedByLifeCycle = true;
        alert.dismiss();
    }
    super.onStop();
}

//GO TO VACATION VIEW OR SICK VIEW

//user clicked on vacView button or sickView button
@Override
public void onClick(View v) 
{
    if(v.equals(this.vacButton))
    {
         Intent i = new Intent(this, VacationLeaveView.class);
         startActivity(i);
    }
    if(v.equals(this.sickButton))
    {
         Intent i = new Intent(this, SickLeaveView.class);
         startActivity(i);

    }

}


//LOG OUT

//user pressed the back button
@Override
public void onBackPressed() 
{
    showAlert();
}
//OnClickListener for logging out warning
@Override
public void onClick(DialogInterface dialog, int which) 
{
    if(which == DialogInterface.BUTTON_POSITIVE)
    {
        MainController.getInstance().clearAllChildren();
        dialog.cancel();
        this.finish();
    }
    else
        dialog.cancel();
}

//DIALOG

private void showAlert()
{
    if(alert == null)
    {
        AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);

        alertDialog.setMessage("Vill du logga ut från förskoleportalen?");
        alertDialog.setPositiveButton("Ja", this);
        alertDialog.setNegativeButton("Nej", this);

        alert = alertDialog.create();

        // Title for AlertDialog
        alert.setTitle("Logga ut");
    }

    alert.show();
}

Ответы [ 2 ]

1 голос
/ 11 мая 2011

Это ясно указывает на то, что вы используете растровое изображение очень большого размера, вам просто нужно преобразовать его, чтобы он весил меньше.

0 голосов
/ 11 мая 2011

Ваш контекст "этого" почти наверняка является причиной. Вы должны явно указать контекст, чтобы избежать этой проблемы. Ваша самая проблема обсуждается здесь: Как избежать утечек памяти

Проблема в том, что ... когда вы добавляете свои изображения внутри действия к чему-либо с контекстом «это», а затем меняете ориентацию, которую изображение передается вместе со всем остальным, что «это», в onCreate () метод как часть комплекта. Делайте это снова и снова, и вы фактически получите 1 изображение на изменение ориентации в памяти. Документация Android говорит об этом дословно.

...