마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

에러좀 봐주세요 stackoverflowerror

0 추천
01-20 12:29:17.193: E/AndroidRuntime(2597): java.lang.StackOverflowError

로그입니다

아무래도 stackoverflow가 문제인것 같은데 보니까

fragment에서 여러번 왔다갔다 하니까 자꾸 저 에러가 생기면서 강제종료가 됩니다

어떻게 해결해야하쥬ㅠㅠ
꿀떡 (2,700 포인트) 님이 2016년 1월 20일 질문

2개의 답변

0 추천
 
채택된 답변
FragmentManager fragmentManager = getFragmentManager();	

TestFragment frament = new TestFragment();	
Bundle bundle = new Bundle();	
frament.setArguments(bundle);	

FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();	
fragmentTransaction.add(R.id.container, fragment); // Activity 레이아웃의 View ID	
fragmentTransaction.commit();

FragmentTransaction의 add Method를 통해서 commit할 Container View의 ID와 Fragment를 준면 된다. add는 Fragment가 계속 쌓이게 되며, replace는 하나의 Fragment가 존재하며 바꿔치기 한다. add로 Fragment를 추가 하게되면 View가 계속 쌓인 만큼 성능 또한 느려지는 점 주의하자.

-----------------------------------------------------------

클릭할때마다 add를 해주어서 fragment가 중첩으로 계속 쌓이게 됩니다. add가 startActivity의 개념으로 보시면됩니다. 이미 호출한 fragment를  재호출 요청하는경우에는 add보다는 replace를 이용 하시는걸추천드립니다. 아니면 이미 호출한 fragment에 대해서 show(), hide()를 사용하는것도 방법입니다.

 

 

익명사용자 님이 2016년 1월 20일 답변
꿀떡님이 2016년 1월 20일 채택됨
0 추천
일반적으로 스택오버플로우는 함수의 무한 재귀호출 시 발생합니다.

물론 말이 무한이지 실지...

public void a() {

    b();

}

public void b() {

    a();

}

이런 극단적인 코드에서만 발생하는건 아니고 함수호출의 연계가 너무 길어질 때도 발생합니다.

예를 들어

public class MyActivity extends Activity {

...

public void onCreate(Bundle b) {

    a();

}

protected void onStart() {

    a();

}

protected void onResume() {

    a();

}

private void a() {

    b();

}

private void b() {

    c();

}

....

....

}

예제가 참 뭐 같네요 -_-;;;;

암튼 이런식이라는거지 꼭 이런 케이스에서만 발생한다는건 아닙니다.

오류로그를 잘 보시고 발생 지점에 브레이크를 걸어 디버깅모드에서 호출스택을 직접 확인하여 로직은 간결하게, 혹은 중복됨이 없도록 수정하시면 될 것 같습니다.
비애천사 (12,090 포인트) 님이 2016년 1월 20일 답변
제 코드가 1버튼을 누르면 fragment1로 2버튼누르면 fragment2로 바뀌는 것인데 한 5번바꾸니까 저 에러로그가 뜨면서 튕기더라구여ㅛ 어떻게해야하죠ㅠㅠ
소스 코드도 없고, 저 에러 한줄만으로는 답변이 불가능합니다. 관련된 소스와 에러로그를 첨부해주세요
일반적으로 원글 작성자분께서 올리신 것 같은 오류 발생 시 콜스택이 로그창에 표시됩니다.
예를 들면...
01-20 16:06:27.023: W/System.err(4187):     at com.google.android.gms.org.conscrypt.OpenSSLSessionImpl.<init>(SourceFile:88)
이런식이죠...
자세히보시면 문제가 발생한 패키지명, 클래스 심지어 함수이름과 라인넘버까지도 표시가되며
로그창에서 해당 라인을 더블클릭하면 해당 소스부분으로 바로 이동까지 가능합니다.
질문자님의 경우 이런식으로 문제가 발생한 부분으로 가서 해당 함수를 누가 몇번이나 호출하는지를 보시고 수정하시면 되겠지요.
...