[Android] Android Volley Lib OutOfMemoryError: pthread_create

👻·2022년 5월 10일
0

Android

목록 보기
3/11
post-thumbnail

📌 개요

Http 요청을 보내는 것을 Volley 라이브러리로 사용해보던 중이였다.

Volley는 아래와 같은 이점이 있다.

  • 네트워크 요청에 대한 자동예약
  • 여러 개의 동시 네트워크 연결
  • 표준 Http 캐시 일관성을 갖춘 투명한 디스크 및 메모리 응답 캐싱
  • 요청 우선순위 지정 지원
  • 취소요청 API
  • 용이한 맞춤 설정(Retry, Back off)
  • 디버깅 및 추적 도구

아래 코드와 같이 간략하게 Http요청을 보낼 수 있고,
예외 발생 시 리스너를 따로 만들지 않아도 바로 사용할 수 있다.

요청 시 간단한 파라미터 값을 설정할 수도 있고,
JSON방식으로도 요청할 수 있다.

final TextView textView = (TextView) findViewById(R.id.text);
    // ...

    // Instantiate the RequestQueue.
    RequestQueue queue = Volley.newRequestQueue(this);
    String url ="http://www.google.com";

    // Request a string response from the provided URL.
    StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
                new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            // Display the first 500 characters of the response string.
            textView.setText("Response is: "+ response.substring(0,500));
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            textView.setText("That didn't work!");
        }
    });

    // Add the request to the RequestQueue.
    queue.add(stringRequest);

사용 도중 이슈가 발생했다.

1시간 간격으로 서버에 요청을 보내던 부분에 대해서는 오류가 발생하지 않았었다.
(3일정도 구동한 기준)

그런데, 10~20초 간격으로 요청해야하는 부분에 있어서 이슈가 발생했다.

UncaughtExceptionHandler : java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Try again

메모리가 초과되었다고 한다.


📌 해결방안

StackOverflow에서 곧바로 해결방안을 찾을 수 있었다.
"Initiating new requestQueue from every working activity is not actually a good idea."
보자마자 아차 싶더라.. 너무 생각없이 코드를 짰다..
https://stackoverflow.com/questions/32844279/out-of-memory-error-when-use-volley-library/35259579#35259579

현재 내 코드에서는 요청을 보낼 때 마다 RequestQueue가 새로 생성되도록 되있다.
https://developer.android.com/training/volley/simple?hl=ko#java
안드로이드 개발자 웹페이지에서 보여준 방식을 아무 생각 없이 그대로 썼다.
사실상 실행 시 처음 한번만 생성하고, 그 뒤로는 생성했던 객체를 쓰는 것이 맞다.

RequestQueue 객체 생성 도중 메모리 초과 오류가 발생했었으니
이 부분이 문제인 것은 확실했다.

수정 후 테스트 결과 같은 이슈가 발생하지 않았다.

profile
Software Developer

0개의 댓글