안드로이드 개발 질문/답변
(글 수 45,052)
안녕하세요.
어플리케이션 모듈과 서비스 모듈을 따로 구동해야 하나요?
즉, 한개의 어플리케이션 안에 서비스 모듈을 포함하는 구조가 잘 못된 구조인가요?
서비스 모듈을 네트웍 처리를 서비스 모듈로 구현 후 어플리케이션을 실행하면 네트웍 처리 시간동안 블럭되는 현상이 발생하더군요..
어플리케이션 모듈과 서비스 모듈을 따로 구동해야 하나요?
즉, 한개의 어플리케이션 안에 서비스 모듈을 포함하는 구조가 잘 못된 구조인가요?
서비스 모듈을 네트웍 처리를 서비스 모듈로 구현 후 어플리케이션을 실행하면 네트웍 처리 시간동안 블럭되는 현상이 발생하더군요..
2010.02.10 22:07:56
어플 내의 서비스는 원래 지원하는 항목이니 잘못된 구조는 아니구요. 어플리케이션의 thread와 service의 thread는 별개인거 같은데 서비스에서 socket처리할 때 UI까지 블럭되긴 하더군요. 그래서 async socket을 구현해볼까하다가 서비스내에서 socket생성 및 read, write 하는 부분을 별도의 thread로 돌리니 블럭안되서 그냥 그렇게 처리했었습니다 ( --);;;
2010.02.11 01:20:40
Thread를 상속받아 run()메서드를 오버라이드 해서 구현하는방법도 있고 Runnable 인터페이스를 구현하는 방법이 있습니다.
네트워크같은 경우는 소켓이 계속 연결을 유지해야되기때문에 별도의 스레드 운용이 필요합니다.
네트워크같은 경우는 소켓이 계속 연결을 유지해야되기때문에 별도의 스레드 운용이 필요합니다.
2010.02.11 10:40:33
아래와 같이 Handler와 Runnable 로 구현해도 블럭상태가 되는데... 이렇게 하면 안되나요? 다른 방법으로 해야 하나요?
public class myService extends Service {
private Handler mHandler = new Handler();
private Runnable mPowerRunable = new Runnable() {
public void run() {
gatheringDeviceMeterData(); // 이 부분이 네트웍 처리를 하는 부분으로, 어플리케이션이 블럭상태가 되는 곳입니다.
mHandler.postDelayed(this, 1000*10);
}
};
2010.02.12 22:06:20
new Thread(mPowerRunnable).start() 로 하시면 블럭안될 겁니다. (저도 첨에는 Handler를 사용했었는데 블럭되더군요 ㅡ.ㅡ handler도 내부적으로는 thread일듯 한데 왜그런지는 잘....)
2011.03.22 10:42:41
아래 내용이 있네요.
서비스가 오랜 시간이 걸리는 작업인 것을 알고 있다면, 액티비티에서는 그냥 호출하면 안된다네요. 반드시 별도의 쓰레드를 만들어서 서비스를 호출하란 소리네요. ^^ 저도 바꿔야 할 듯!
- Incoming calls are not guaranteed to be executed on the main thread, so you need to think about multithreading from the start and properly build your service to be thread-safe.
- By default, RPC calls are synchronous. If you know that the service takes more than a few milliseconds to complete a request, you should not call it from the activity's main thread, because it might hang the application (Android might display an "Application is Not Responding" dialog)—you should usually call them from a separate thread in the client.