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

android.os.NetworkOnMainThreadException 에러

0 추천

현재 안드로이드를 공부하고있는 학생입니다. 

BlogsSearchResults results = null;


        try {
            String text = URLEncoder.encode(query, "UTF-8");
            String apiURL = blogSearchURL + text; // json 결과
            apiURL += "&display=" + display + "&start=" + start + "&sort=" + sort;
            URL url = new URL(apiURL);
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            con.setRequestMethod("GET");
            con.setRequestProperty("X-Naver-Client-Id", clientId);
            con.setRequestProperty("X-Naver-Client-Secret", clientSecret);

            int responseCode = con.getResponseCode();
            BufferedReader br;
            if (responseCode == 200) { // 정상 호출
                br = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
            } else { // 에러 발생
                br = new BufferedReader(new InputStreamReader(con.getErrorStream(), "UTF-8"));
            }

            String inputLine;
            StringBuffer response = new StringBuffer();
            while ((inputLine = br.readLine()) != null) {
                response.append(inputLine);
            }
            br.close();

            Gson gson = new Gson();
            results = gson.fromJson(response.toString(), BlogsSearchResults.class);
        } catch (Exception e) {
            System.out.println(e);
        }



return results;

이런 예제를 만들고있는데 안드로이드 3.0부터는 네트워크사용할때 main thread를 사용하지않게 되있다고 들었습니다. 그래서 구글링으로 찾아보고 공부를하고있는데 이해가 너무 안가서 질문을 남깁니다...

현재 int responseCode = con.getResponseCode() 이 부분에서 catch쪽으로 빠지고,,, html값을 받아와야한다는데 혹시 자세한 설명을 들어주실수있을까요 ?

익명사용자 님이 2019년 10월 13일 질문

1개의 답변

0 추천
아뇨 저 부분 전체가 그냥 메인쓰레드가 아닌 다른 쓰레드에서 해야해요.
구글개같다 (140 포인트) 님이 2019년 10월 13일 답변
저 메소드 자체가 다른 thread로 돌리고 실행해야한다는 말씀이시죠 ?
네. 네트워크 연결의 경우 서버에서 응답이 없을 경우 응답이 내려오거나 timeout이 걸릴 때까지 동작이 멈추게 되며, 이 경우 안드로이드 화면 갱신 같은 것도 멈추게 되서
네트워크 통신은 무조건 별도 Thread에서 동작되도록 강제하게 위해 MainUI Thread에서 통신을 시도할 경우  Exception을 발생하게 되어 있습니다.
...