2011-08-18 3 views
1

나는 안드로이드 애플리케이션의 다른 부분들 사이의 레이어를 엄격하게 분리했습니다. 일부 지점에서 인터넷의 xml 서비스에서 데이터를 업데이트하고 있습니다. 업데이트는 약 10 초 정도 소요되며 백그라운드에서 완전히 완료됩니다. 즉, 응용 프로그램의 사용자 인터페이스가 정상적으로 작동합니다. 그러나 데이터 업데이트를 담당하는 클래스 (이후 DataManager)를 추가로 호출하면 (업데이트가 시작되었지만 아직 완료되지 않은 경우) 응용 프로그램이 중단됩니다. NullPointerException는, null가 아닌 오브젝트와 함께 슬로우됩니다.안드로이드 동시성 문제

그래서 한 번에 하나의 스레드 만 내 DataManager를 사용할 수 있고 다른 스레드에서 DataManager를 호출하면 예외가 발생한다고 가정합니다.

민감한 메소드 근처에 '동기화 된'키워드를 여러 가지 조합으로 시도했지만 업데이트가 실행될 때 아무것도 보이지 않습니다. 아무 것도 내 DataManager의 아무 것도 사용할 수 없습니다.

BTW 실행 중에 DataManager와 관련된 기타 클래스도 null 개체를 보유하고있는 것처럼 보입니다.

나는 동시성 문제를 다루는 데 사용되는 일종의 디자인 패턴을 놓친 것 같아 누구나 나에게 뭔가 제안 할 수 있을까?

+1

NullPointerException의 근본 원인이라고 생각되는 코드를 제공 할 수 있습니까? 동시성 문제에 대한 아이디어를 얻는 것은 어렵습니다. –

+0

NullPointerException이 하나 뿐인지를 확인한 다음 직접 처리 할 수 ​​있었는지, Android 앱을 디버깅하는 데 경험이 많습니다. 그러나이 문제는 전체 애플리케이션에 영향을 미치는 것 같습니다. 슬프게도 코드가 너무 많아서 코드베이스가 상당히 크기 때문에 코드를 제공 할 수 없습니다 ... 일부 바보 같은 변수를 초기화하는 것을 잊어 버린 것처럼 아닙니다 ... 업데이트하지 않을 때 모든 것이 완벽하게 작동합니다. 그리고 업데이트는 관리자 클래스에서 실제로 4 개의 ArrayList 만 처리합니다. 실제로 잠깐 기다려주세요. 업데이트 방법을 게시하고 조금 설명 할 수 있습니다. – Kostas

+0

그래서 이것은 모든 업데이트를 수행하는 실제적인 방법입니다 : http://pastebin.com/gY3x8wiq 4 개의 언급 된 ArrayList에만 직접 (그리고 간접적 인) 접근이 있습니다. 이 실행 중에 다른 객체도 영향을받습니다. – Kostas

답변

2

스레딩 문제로 인해 Apache HTTP 클라이언트를 사용하는 데 어려움이 있었으며 문제가 비슷한 점이 있다고 생각합니다. 내가 한 일은 콜백 체계를 설정하는 것이 었습니다. 물론 이것은 당신을 위해 작동 할 수도 있고 작동하지 않을 수도 있습니다.

이것은 당신에게 Rube Goldberg와 비슷하지만 조금 효과적이었습니다.

내 UI 스레드가 데이터를 가져올 스레드를 생성하는 메서드로 데이터 관리자 개체를 호출하게됩니다. 메서드의 반환 값은 데이터를 가질 수있는 객체입니다. 내 활동은 "DataCallbackInterface"와 같은 인터페이스를 확장하여 스레드가 데이터 (즉, 실행()의 마지막 줄)를 획득 한 후에 호출 할 수있는 메서드를 갖게했습니다. 이 호출은 본질적으로 다른 스레드 내에 있기 때문에 Handler를 사용하여 DataCallbackInterface 메소드 구현에 유용한 모든 것을 실행해야합니다. 이 메서드가 호출되면 데이터가 존재한다는 사실을 알게되고 이상한 동기화 플래그를 사용하여 올바르게 처리 할 수 ​​있습니다.

+0

그건 실제로 훌륭한 아이디어입니다. 이벤트를 사용하면 업데이트를 실행하는 동일한 스레드 내에서 DataManager를 잠그고 다른 프로그램 부분에서는 DataManager를 올바르게 사용할 수 없습니다! 권리? : D 그래서 모든 것을 실행하고 마지막 줄의 코드 일 때만 데이터를 반환하는 백그라운드 작업을 만들어야합니다. 따라서 실행 중일 때 DataManager의 이전 데이터로 프로그램이 작동하고 업데이트 실행이 완료되면 데이터가 대체됩니다. 스레드 걱정도 없습니다! 권리? 내 말은, 나는이 아이디어를 올바르게 얻었습니까? – Kostas

+0

내가 그랬다고 생각해. 그것은 내 응용 프로그램의 일부를 재 설계해야 할 필요가 있지만 확실히 작동 할 것입니다! 고맙습니다 :) – Kostas