Android NetworkOnMainThreadException 해결

 

1. 개요

 - http://niphyang.tistory.com/930

 - 위 포스팅에 나와있는 HttpURLConnection을 Android 환경에서 작업하다 겪은 내용에 대한 정리이다

 

2. 에러 내용 (https://developer.android.com/reference/android/os/NetworkOnMainThreadException)

응용 프로그램이 기본 스레드에서 네트워킹 작업을 수행하려고 할 때 발생하는 예외입니다.

이것은 Honeycomb SDK 이상을 대상으로하는 응용 프로그램에서만 발생합니다. 이전 SDK 버전을 대상으로하는 응용 프로그램은 기본 이벤트 루프 스레드에서 네트워킹을 수행 할 수 있지만 사용하지 않는 것이 좋습니다.

 - 링크에 들어가보면 외국인이 친절한 영어로 에러 내용을 적어놓았으나 필자는 번역기를 이용하여 이해하도록 하였다

 - 내용은 즉슨 기본 스레드에서 네트워킹 작업을 수행할 수 없다는 것

 

 

 

3. 해결 방안은 AsyncTask (https://developer.android.com/reference/android/os/AsyncTask)

AsyncTask를 사용하면 UI 스레드를 적절하고 쉽게 사용할 수 있습니다. 이 클래스를 사용하면 스레드 및 / 또는 핸들러를 조작하지 않고도 백그라운드 작업을 수행하고 UI 스레드에 결과를 게시 할 수 있습니다.

 - 역시나 AsyncTask의 내용은 영어로 잘 설명되어있다

 - 이제 이용해보겠다

 

4. 해결 예제

 

- 아래 예제의 HttpConnectionUtil 클래스는 http://niphyang.tistory.com/930 포스팅에 나와있는 내용이고 Android에서 사용하기 위해서 AsyncTask를 이용하였다

 

JAVA HTTP POST 전송 예제

JAVA HTTP POST 전송 예제 1. 아래 HttpConnectionUtil의 메소드를 이용한다 - 메소드명 : postRequest - 파라미터 : { pURL : 생성할 난수의 길이 ,pList : 파라미터 객체 (HashMap<string,string>) } import jav..</string,string>

6developer.com

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


    //SampleTask 호출 (허니콤을 기준으로 호출방식이 변경되었다)
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) //3.0
        new SampleTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
    else
        new SampleTask().execute();
}


private class SampleTask extends AsyncTask < Void, Void, String > {
    protected String doInBackground(Void...params) {

        HashMap < String, String > param = new HashMap < String, String > ();
        param.put("name", "닢향");
        String resp = HttpConnectionUtil.postRequest(BASE_URL + VERSION_URL, param);

        return resp;
    }


    protected void onPostExecute(String result) {
        super.onPostExecute(result);

        //result 값을 파싱하여 원하는 작업을 한다
    }
}

 

양심상 출처는 밝혀주자