반응형
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를 이용하였다
@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 값을 파싱하여 원하는 작업을 한다
}
}
양심상 출처는 밝혀주자
반응형
'개발 > Android' 카테고리의 다른 글
Android 루팅 여부, 루트 권한 체크하기 (0) | 2019.11.08 |
---|---|
html 난독화는 가능한가 (Android Assets APK 압축해제) (0) | 2019.11.05 |
FCM 푸시 메시지를 구현하며 발생한 문제들을 모두 해결해보았다 (0) | 2019.10.07 |
구글 플레이스토어 지원하는 기기 0대 안드로이드 앱 배포 후 (4) | 2019.09.04 |
구글 플레이 스토어 - 앱이 거부되었습니다 (15) | 2019.08.09 |