Http 요청을 보내는 것을 Volley 라이브러리로 사용해보던 중이였다.
Volley는 아래와 같은 이점이 있다.
아래 코드와 같이 간략하게 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 객체 생성 도중 메모리 초과 오류가 발생했었으니
이 부분이 문제인 것은 확실했다.
수정 후 테스트 결과 같은 이슈가 발생하지 않았다.