티스토리 뷰
안드로이드 모바일에서 PUSH를 3rd-party server로 던지는 작업을 했다.
다음과 같이 한가지의 push 객체로 두가지의 method를 처리하는 것을 했다.
그런데 서버에서는 두번째 메소드에서 사용하는 전달 파라미터를 가지고 두번 동시에 호출하는 경우가 발생했다.
즉, 두번째 호출한 sendPostWithBlock()만 출력된 모습만 보면 두 번 호출이 되는 것이다.
이것은 심각한 오류였다. 동시적으로 메서드를 호출하는 경우가 많은데 다음에 호출한 메서드가 먼저호출된 메서드를 먹어버리는 경우가 생긴다.
그래서 사태파악에 들어갔다.
사태는 push 객체의 Class인 PostToServer 안에 메서드를 선언할때, private의 전역변수로 공유하고 있었다.
이것이 문제인 이유는 두가지 메서드가 메서드 내부에 전달된 파라미터를 전역변수로 전달하여 사용하는 경우에,
내가 구현한 메서드 안에는 Thread가 돌아가고 있기 때문에 위의 코드처럼 호출 간격이 엄청나게 가까운 경우,
두 메서드의 호출시 메서드 처리를 위한 Thread가 동시에 생성되는데, 같은 전역변수를 참조하고 있는 경우를 발생시킵니다.
쉽게 말하면 메서드가 호출된 순서대로 처리되는 시간보다 도중에 전역변수를 매개변수가 바꿔주는 수순이 더빨라서,
첫번째 메서드가 전역변수에 파라이터를 전달해서 먼저 바꾸고,
두번째 메서드가 전역변수에 파라미터를 전달해서 다시 바뀐상태에서 바뀐 변수를 사용해서 두 메서드가 나머지 코드를 사용하기 때문이었습니다.
그래서 결국 솔루션은
1. 호출부분에서 아예 같은 리소스나 변수를 사용하지 않도록 객체를 다르게 사용해서 함수를 각기 다른 메서드에서 호출하거나,
2. 같은 Class 내부에서 현재처럼 전역변수로 변수를 공유하는 것이 아니라, 각 메서드가 지역변수로 메서드를 사용하면 됩니다.
저 같은 경우는 기존에 메서드를 호출하는 부분을 수정하지 않고 PostToServer 클래서 내부에서 지역변수를 사용해서 서로 변수사용을 겹치지 않게 하였습니다.
'etc' 카테고리의 다른 글
구글 애널리틱스(Google Analytics) 소개 (4) | 2017.04.28 |
---|---|
라즈베리파이 Ubuntu로 사용하기 (0) | 2016.11.17 |
어플리케이션 기획 절차 (1) | 2016.07.08 |
안드로이드의 content_main과 activity_main의 차이점. (0) | 2016.07.07 |
Server에 SSL 적용시 text 전송은 되는데 image가 보여지지 않는 경우 (0) | 2016.06.16 |