안드로이드 프래그먼트 onCreate에 와일문 사용시 화면 멈춤현상

조회수 1755회
public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        preferences = getActivity().getSharedPreferences(PreferencePutter.PREF_FILE_NAME, Activity.MODE_PRIVATE); 



        if (NetworkUtil.getConnectivityStatusBoolean((getActivity()))) {   
            //네트워크 연결 상태를 판단

            request();         // 서버에 데이터 요청

            while (!flag) {        // 플래그변수가 트루일때 빠져나옴
            }
            flag = false;            // 플래그변수를 다시 초기화


        } else {
            setLayoutWithout_Net();    // 네트워크 연결이 없을때 불러올 화면
        }

    }

안녕하세요. 월요일부터 질문을 올리네요.. 몇일간 같은 문제로 해결중입니다.. ㅜㅜ 롤리팝 이하버전까지는 사용시 문제가 없었는데 마시멜로부터 로그인 이후 화면이 멈추는 현상이 발생하고 있습니다..

플래그변수는 boolean 형으로 전역변수로 사용중이고, 첫 초기화상태는 false 상태입니다. 로그인 이후 화면에서 onCreate 부분에 while 부분 때문에 화면 멈춤현상이 생기는 것 같습니다.

위 소스에서 while문은 서버에 요청한 데이터들을 다 받아와 질때까지 대기하는 조건으로 만들어 놓은 부분입니다.

데이터가 다 받아와지면 플래그변수가 요청 함수에서 트루로 값을 바꾸게 되며 와일문을 빠져나와서 여기에는 따로 적지 않았지만, 아래 onCreateView를 통해 값들을 화면에 뿌려지게 됩니다.

마시멜로 버전에서 릴리즈 모드에서만 이런 멈춤현상이 있는데요, 제 생각으로는 while문에서 빠져나오지 못하여 무한루프로 인한 화면 멈춤현상으로 생각됩니다.

현재 while문을 지워버리면 마시멜로에서도 정상작동이 되지만 로그인 이후 값이 바로 화면에는 안뿌려지네요.

이게 제가 처음부터 작업한 소스가 아니라서 설명이 명확하지 않아서 바로 이해가 되실지 모르겠습니다만, 추측성 답변이라도 좋으니 아는부분이 있으시다면 답변해주시면 감사하겠습니다.

긴 질문 읽어주셔서 감사합니다. 날이 많이 추워졌는데 따뜻하게 입고 출퇴근 하시길..

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 서버로 요청한 코드를 다 받을 때까지 메인 스레드(UI 스레드)를 블럭시키면 안됩니다. 즉, 올려주신 코드처럼 메인 스레드에서 while()문을 사용하면 안된다는 얘기이고요. 마시멜로우에서만 발생한다고 생각하실 수 있지만 사용자 네트워크 환경에 따라서 얼마든지 ANR이 발생할 수 있습니다.

    우선 while()문을 제거한 후 네트워크 요청이 완료되면 UI로 이벤트(메시지)로 알려주는 방식으로 코드를 수정하세요. 방법 중 하나로 AsyncTask 또는 Thread + Handler를 사용 할 수 있습니다. 관련해서는 구글링을 해보면 어렵지 않게 예제 코드들을 발견할 수 있습니다.

    AsyncTask

    Thread, Handler

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 답변 감사드립니다. 제가 서버에서 파싱해오는 기능을 가진 앱은 처음 다뤄봐서 여러가지 부족하네요. 한로니로니님께는 항상 감사합니다. 올려주신 예제들 참고해서 수정해보겠습니다. 알 수 없는 사용자 2016.11.1 08:41

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)