2011-05-11 6 views
0

두 개의 이미지 버튼이 포함 된 활동이 있습니다. 사용자가 alertDialog를 클릭하면 다시 표시됩니다. 경고가 표시되는 동안, 경우 방향이 메시지와 함께 앞뒤로 몇 번 응용 프로그램이 충돌을 변경 다음에 AlertDialog하지있을 경우 메모리 부족, 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 

는, 응용 프로그램이 충돌하지 않습니다.

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(); 
} 
+0

이 동작은 메모리 누수가 있음을 나타냅니다. 꽤 나쁘게 뭔가를 누출하고 있습니다. –

답변

0

"this"라는 컨텍스트가 거의 확실합니다. 이 문제를 피하려면 명시 적으로 컨텍스트를 지정해야합니다. 당신의 바로 그 문제는 여기에서 논의됩니다 : Avoiding Memory Leaks

문제는 이것입니다 ... 당신이 "this"의 컨텍스트를 가진 무언가에 활동 내부의 이미지를 추가하고 이미지가 다른 것과 함께 전달되는 방향을 변경하면 번들의 일부로 onCreate() 메서드에 "this"입니다. 반복해서 반복하면 실제로 메모리에서 방향 변경 당 1 개의 이미지로 끝납니다. Android 설명서는이 말을 그대로 말합니다.

+0

답변에 제공된 설명서 링크에서 논의되었으므로 그 곳보다 더 잘 말할 수는 없습니다. –

+0

감사합니다. 문제에 대해 아주 잘 설명해주십시오. 내 onStop 메서드에서 두 줄의 코드를 추가하여 문제를 해결했습니다. sickButton.setImageBitmap (null); vacButton.setImageBitmap (null); – notBanana

+0

내가 도울 수있어서 기쁘다. –

1

매우 큰 크기의 비트 맵을 사용하고 있다는 것을 분명히 나타내줍니다. 무게가 덜 나가도록 변환해야합니다.

+0

AlertDialog가 표시되지 않으면 응용 프로그램이 충돌하지 않습니다. 이미지의 크기가 문제가 아니라고 생각하는 것이 잘못 되었습니까? – notBanana

+0

안드로이드 문서에서 논의 된 것처럼 메모리 누수를 수정하거나 응용 프로그램에 다르게 추가 할 때 이미지의 크기는 문제가되지 않습니다. 내 대답의 링크를 참조하십시오. 구체적으로 귀하의 문제에 대해 이야기합니다. –