2012-12-10 4 views
1

저는 안드로이드 개발의 초보자입니다. 자바 서버에 연결하여 일부 패킷을 보내고받는 안드로이드 udp 클라이언트를 구현하려고합니다. 이 프로세스에서는 특정 네트워크의 QoS를 측정하는 데 사용되는 일부 데이터 (예 : 왕복 지연 등)를 수집합니다. 연결을 구현하고 자바 스레드를 사용하여 데이터를 보내거나 받으려고 시도했지만 응용 프로그램이 충돌하고 둘 이상의 스레드를 사용하려고하면 중단됩니다. 그래서 대안을 찾고 있습니다. 이 사이트뿐만 아니라 다른 링크를 통해 나는 안드로이드 다중 스레드에서 AsyncTask, 처리기 등을 사용하여 구현할 수있는 것으로 나타났습니다. 또한 서비스 클래스는 또한 백그라운드 서비스를 실행하는 데 도움이되는 것으로 나타났습니다. 제 목표를 달성하는 데 가장 적합한 방법이 무엇인지 제안하십시오. 미리 감사드립니다. 안드로이드 애플 리케이션에서 멀티 스레딩을 구현하는 가장 좋은 방법/선호하는 방법은 무엇입니까

+0

온라인 기사를 읽은 후에, 나는 Executor와 ExecutorService를 발견했다. 그래서 이것은 내가 시험해 본 것입니다. 주 활동 수업 내에서 데이터 그램의 송수신을 처리하기 위해 두 개의 실행 가능한 개체를 만들었습니다. 그런 다음 executor에서 execute 메소드를 호출하고 runnable 객체를 매개 변수로 전달하여이 두 스레드를 시작했습니다. 이제 내 PC에서 실행중인 자바 서버가 패킷을 계속 수신하지만 안드로이드 클라이언트는 응답이 없습니다. 즉, UI가 응답하지 않습니다. 내가 어디가 잘못 될지 모르겠다. –

답변

0

안드로이드 멀티 스레딩을 수행하는 방법에 폭 넓은 스트로크로 적용 할 수있는 정답은 하나도 없습니다. 특정 요구가 무엇인지에 따라 여러 가지 방법으로 접근 할 수 있습니다.

Android에서 장시간 실행되는 통화 차단은 응용 프로그램이 충돌하는 결과를 가져옵니다.

가장 일반적인 해결책은 AsyncTask를 사용하는 것입니다. 예를 들어 Activity 내의 일부 XML 데이터에 대해 웹 API 끝점을 호출하려고 할 때 AsyncTask를 사용하고 doInBackground 내에서 호출을 시작합니다.

대기 시간이 길거나 알 수없는 대기 시간 인 경우 적절한 해결책이 아닙니다. 또는 메시지 큐잉 서비스와 같은 대기 상태가 항상 존재하는 상황에서. 이러한 유형의 상황에서는 Service 클래스 확장을 기반으로 별도의 앱을 작성하는 것이 가장 좋습니다. 그런 다음 웹 서비스와 통신하는 것과 비슷한 방식으로 기본 응용 프로그램에서 서비스로 /에서 알림을 보내고받을 수 있습니다.

+0

예. 앱이 사용자가 전송을 중단 할 때까지 패킷을 계속 전송해야하기 때문에 스레드의 실행 시간이 상당히 길다. 앞서 사용한 접근법은 데이터 그램을 보내고 받기 위해 각각 별도의 스레드를 만드는 것이 었습니다. 그러나 스레드를 사용하여 직면 한 문제는 프로그램이 충돌하고 응답하지 않는 UI가 발생했습니다. 따라서 서비스를 사용하려면 각 개별 실행 스레드에 대해 별도의 서비스를 만들어야합니까? 또한 적절한 기사에 대한 링크가 도움이 될 것입니다. –

+0

다음은 좋은 자습서로 연결되는 링크입니다. http://www.vogella.com/articles/AndroidServices/article.html. 서비스가 자체 프로세스로 실행되도록 설정했는지 확인하십시오. 그렇지 않으면 주 스레드가 차단되어 충돌을 일으킬 수 있습니다. AsyncTask는 자동으로 별도의 스레드로 회전 한 다음 완료되면 자동으로 해제되지만 서비스 경로를 이동해야 할 것처럼 들립니다. – bigtunacan

+0

링크를 제공해 주셔서 감사합니다. 분명히 그것을 통과하고 이에 따라 내 앱을 구현하려고합니다. –

0

AasyncTask를 사용하면이 작업을 수행 할 수 있으며 서비스가 유용 할 수도 있습니다. 응용 프로그램이 백그라운드에서 원하는대로 작업을 수행 할 수있는 경우 사용자가 인터페이스로 응용 프로그램을 사용해야하는 경우 AsyncTask를 사용해야합니다. 크래킹

+0

충돌을 피하기 위해 AsyncTask를 사용하는 방법을 자세히 설명해 주시겠습니까? –

+0

AsyncTask를 사용하는 이유는 네트워크 요청을 처리하거나 UR이 데이터베이스 쓰기를 시도 할 때 원인이 안드로이드 시스템이 응용 프로그램을 손상시키는 5-10 초 (ANR) 동안 응답하지 않는 응용 프로그램을 제거하게되므로 백그라운드에서 수행하기 위해 네트워크 요청을 AsyncTask에 넣어야합니다. 그러면 사용자가 네트워크 요청을 완료 할 때까지 대기합니다. –

관련 문제