2012-01-27 2 views
4

이 기능을 구현하는 가장 좋은 방법은 무엇입니까? 파이썬 서버를 사용하여 라운드에서 2 대의 전화 사이의 통신을 허용하는 Android 앱이 있습니다. 라운드는 라운드가 시작될 때까지 서로 이야기 할 수 없다는 것을 의미하며, 일단 상대방이 응답 할 때까지 다른 사람을 보낼 수없는 메시지를 보내면 새로운 라운드가 시작됩니다.IntentService, Service 또는 AsyncTask

나는 IntentService를 사용할 것이라고 생각했지만 서버를 끊임없이 시작하고 멈추는 것은 잘못된 것처럼 보였고 asynctask와 관련된 문제에 대해 걱정할 필요가 없거나 그것을 처리하는 가장 좋은 방법이다. . 어떻게하면 클라이언트에게 메시지를 보내고 받아야하는 서비스를 가질 수 있습니까?

답변

2

내가 아는 한 문제점은 작업자 큐 모델 Producer-consumer 모델입니다. Intentservices는 그렇게하기위한 것입니다. 멀티 스레딩 만하면 서비스를 사용해야합니다. IBinder 인터페이스를 사용하여 활동 및 서비스와 통신 할 수 있습니다.

Asynctask는 특수 스레드이므로 UI를 쉽게 업데이트 할 수 있습니다. 그러나 귀하의 경우 IntentService가 최선의 선택 인 것으로 보입니다.

+0

틀렸어 : * 서비스는 다른 응용 프로그램 개체와 마찬가지로 호스팅 프로세스의 주 스레드에서 실행됩니다. 즉, 서비스가 CPU 집중적 인 작업 (예 : MP3 재생) 또는 차단 (예 : 네트워킹) 작업을 수행하는 경우 해당 작업을 수행 할 자체 스레드를 생성해야합니다. * 서비스가 스레드가 아닙니다. 주 스레드에서 작업을 수행하는 것은 자체가 아닙니다 (응용 프로그램이 응답하지 않는 오류를 방지하기 위해). 멀티 스레딩이 필요한 경우에만 그렇습니다. – roiberg

+1

IntentService는 메인 스레드 인 @roiberg의 처리를 처리하기 위해 AsyncTask를 사용합니다. – lilbyrdie

+0

@roiberg 수정하십시오. 서비스는 메인 스레드에서 작동합니다. 이 대답을보다 명확히하기 위해 서비스는 멀티 스레딩 (스레드 풀) 또는 백그라운드에서 매우 오랫동안 일련 화 된 실행자/처리기 스레드를 유지하는 데 유용합니다. – manjusg

5

IntentService/Broadcast Receiver 경로를 적극 권장합니다. AsyncTask와 관련된 구성 변경 문제를 피하면 10 배나 쉽게 사용할 수 있습니다.

+0

메시지가있는 표준 스레드가 아니라 트릭을 수행합니까? 액티비티는 구성 변경 후에도 백그라운드 스레드로부터 메시지를받습니다. 그렇지 않습니까? – Yar

+1

스레드는 원래 컨텍스트에 대한 참조를 유지합니다. 구성 변경 후 컨텍스트/처리기를 다시 등록하면이 문제를 해결할 수 있지만 수신자 경로는 더 쉽습니다. – SeanPONeil

0

알람을 사용합니다 (AlarmManager을 통해 예약 됨). 그러면 라운드가 시작/종료했는지 확인하도록 설정할 수 있습니다. 그것은 서비스의 장점을 가지고 있지만 배터리 소모의 공포는 아닙니다. 알람을 실행해야하는 빈도에 따라 시간의 열거 (예 : 1 시간/일/주)가 포함됩니다.

경보가 실행되면 폴링하여 현재 상태를보고 그에 따라 대응할 수 있습니다. 예를 들어 알림이 상태 표시 줄로 들어갈 수 있으며 전화가 들리는 소리를 내고 진동 할 수 있습니다.이 기능의 장점은 알람이 브로드 캐스트 리시버를 트리거하므로 사용자가 앱을 계속 실행하지 않아도된다는 것입니다.

알람 코드의 예 : http://www.androidcompetencycenter.com/2009/02/android-basics-alarm-service/

17

의도 서비스는 아무 것도 더 의도에 의해 트리거되는 작업자 스레드, 별도의 스레드에서 자신의 작업을 실행 한 후 종료 얻을 수 없습니다. 그것들은 시작되고 중지되도록 설계되었습니다.

http get 또는 어떤 경우 서버와의 연결을 유지할 필요가없는 상호 작용을 수행해야하는 경우 인 텐트 서비스를 사용하고 브로드 캐스트 이벤트를 사용하여 활동을 알립니다.

앱이 서버 (예 : 영구적 인 tcp 연결)와 연결되어 있어야하는 경우, asynctask를 사용하여 네트워킹 작업을 수행하는 서비스 (의도가 아닌)가 있어야합니다. 서비스에서 호스팅되는 고전적인 스레드. 그런 다음 bindToService()를 사용하여 액티비티를 서비스와 상호 작용할 수 있습니다.

활동 내에서 asynctasks를 사용하지 않는 것이 좋습니다. 회신에 명시된대로 수평/수직보기 변경의 경우 서버 응답을 잃을 위험이 있습니다.

+0

그리고 프래그먼트를 사용하여 회전 문제를 해결할 수 있습니다. 여기에서 https : //gist.github를 확인하십시오.com/daichan4649/2480065 – MSaudi

+0

AsyncTask를 사용하면 화면을 끌 때 서버 연결이 느슨해집니다. – albertTaberner

관련 문제