Computer Language/Android

[Android] 안드로이드 Unable to start activity ComponentInfo: android.os.NetworkOnMainThreadException 임시 해결하기

꽁담 2021. 7. 25. 23:28

상황

안드로이드에서 네트워크를 통해 외부로 접속하려는 상황에서 Permission Denied 오류가 발생하였고

매니패스트에 필요한 권한을 등록한 후에 NetworkOnMainThreadException 에러가 발생하였습니다.

java.lang.RuntimeException: Unable to start activity ComponentInfo: android.os.NetworkOnMainThreadException

 

 

원인

네트워크를 이용하여 데이터를 주고받기 위해서 별도의 Thread 가 필요합니다.

이 때 별도의 Thread 로 구현이 되어있지 않아서 아래사진과 같은 오류가 발생하게 됩니다.

 

별도의 Thread 로 돌리는 이유는 메인은 유지시켜두기 위해서로 생각됩니다.

 

Too Much Info

실제로 많은 프로그램들은 다수의 스레드로 이루어져 있고,

특정 스레드가 죽으면 메인 스레드에서 감지하여 죽은 스레드를 살리는 방식으로 되어있습니다.

 

 

해결방법

액티비티의 onCreate 메소드 내에 아래 StrictMode 코드를 추가해 줍니다.

permitAll 함수에서는 메일스레드로 돌릴 함수만 나열할 수 있으며, 방법은 아래 URL 을 참고하면 됩니다.

이렇게 코드를 추가하면 네트워크를 별도의 Thread 를 구현하지 않고 이용가능하도록 할 수 있습니다.

 

하지만 이 방법은 네트워크 작업이 메인쓰레드로 동작하기 때문에,

네트워크 부하가 많다면 앱이 느려지는 현상이 발생합니다.

 

근본적인 해결방법은 Thread 를 하나 더 생성한 후, 그 Thread 안에서 네트워크 작업이 이뤄지도록 해야 합니다.

이 방법은 JAVA 개념이 더 크므로 여기서는 생략하도록 하겠습니다.

1
2
3
4
5
6
7
8
9
10
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
    }
}
cs

 

StrictMode

실수로 수행할 수 있는 일을 감지하고 주의를 기울여 수정할 수 있도록 하는 개발자 도구입니다.

StrictMode 는 기본 스레드에서 우발적인 디스크 또는 네트워크 액세스를 포착하는데 가장 일반적으로 사용됩니다.

https://developer.android.com/reference/android/os/StrictMode

 

StrictMode  |  Android 개발자  |  Android Developers

 

developer.android.com