2012-03-21 3 views
2

현재 서버에서받은 객체가 있습니다.이 객체에는 캔버스에 그려지는 두 개의 좌표가 포함되어 있습니다.이 객체는 하드 코딩 된 다른 클래스에서 현재 수행 할 수 있습니다 좌표.입력 스트림에서받은 객체를 다른 클래스에 전달

제 문제는 그려지는 두 번째 드로잉 클래스로 객체 (스레드 내)를 보내는 방법을 해결할 수 없다는 것입니다.

답변

1

개체가 스레드 내에 절대로 존재하지 않습니다. 당신이 바라는 최선의 방법은 단지 하나의 쓰레드가 객체를 참조한다는 것이며, 그런 식으로 유지하기 위해서는 지속적인 경계가 필요합니다. 하나의 쓰레드에 의해서만 액세스되는 객체는 하나 이상의 쓰레드에 의해 접근되는 객체가 생각하고 신경 쓰는 곳을 필요로하지 않습니다. 그러나 하나의 스레드에 객체를 유지하는 것은 정말 어렵습니다. 어떤 경우에도 객체를 수행 할 수 없습니다.

서버의 개체는 모든 클래스의 공용 정적 필드에서 참조 할 수 있으므로 프로그램 및 스레드에 관계없이 사용할 수 있습니다. 거기에 에는이 있습니다. 필요에 따라이를 적절하게 캡슐화 할 수있는보다 우아한 방법이 될 수 있습니다. 그러나 이것이 대체 솔루션으로 사용됩니다.

그런 다음 멀티 스레드 액세스를 처리해야합니다. 그것은 당신의 객체가 불변으로 만들어 질 수있는 것처럼 들립니다. 이것은 단지 그것을 참조 필드에 할당하여 "공용"으로 만들면 이론적으로 가능하더라도 다시 변경하지 않는다는 것을 의미합니다. 이것은 일을 더 간단하고 더 빠릅니다. 받은 오브젝트를 작성하고 완전히 조립되면 필드에 놓습니다. 필드에 volatile이라고 표시되어 변경 사항이 다른 곳에 즉시 표시됩니다.

이제 드로잉 클래스는 필요할 때 객체를 볼 필요가 있습니다. 그러나,을 사용하기 전에 개체를 로컬 변수에 복사하려고합니다. 로컬 변수는 드로잉 프로세스를 통해 계속 동일한 객체를 가리 킵니다. 휘발성 필드는 언제든지 변경 될 수 있으며 새롭거나 다른 객체를 지속적으로 참조합니다. 로컬 변수를 사용하면 오래된 경우 X 및 Y 좌표가 항상 일치합니다. (모든 것이 멀티 스레딩 시스템에서 약간 오래된 것입니다.) 필드를 사용했다면 서버에서 보낸 하나의 객체에서 X를 가져올 수 있고 다른 객체에서 Y를 얻을 수 있습니다. (멀티 스레딩의 실제 재미는 X * X이 X가 정수인 경우 두 개의 다른 객체에서 같은 X 값을 제공합니다. 그리고 if (aA != null) aA.doSomething()이 널 포인터 예외를 throw 할 때 로컬 변수를 사용하면이 문제를 방지 할 수 있습니다.)

지금은 동기화 및 대기 상태를 피할 수 있다고 생각합니다.다른 프로그래머 (또는 다른 작업을한지 6 개월이 지난 후에도)가 좌표를 변경하면 코드를 변경하지 않아도 좌표 객체를 실제로 변경할 수 없게 만들 수 있습니다 (final 필드 사용). (사용자/사용자가 수행하는 경우 에 동기화가 필요합니다.)

1

Handler은 메시지 및 데이터를 통신 작업자 스레드에서 UI 스레드로 전송하는 좋은 방법 중 하나입니다.

질문에 기본 코드 개요를 포함하면 더 이상적입니다. 그러나 기본적으로 가지고있는 것은 Activity의 콘텐츠보기로 설정된 전체 레이아웃의 일부인 사용자 정의 View (사용자가 "그리기 클래스"라고 함)입니다. 그런 다음 동일한 Activity 클래스 (또는 별도의 Service 클래스)에 포함될 수있는 통신 작업자 스레드가 있다고 가정합니다. 그러나 지금은 가장 간단한 경우를 가정합니다. 통신 작업자 스레드가 View을 업데이트하려면 UI 스레드에서 View을 업데이트해야합니다. 따라서 메시지 내용을 기준으로 View을 업데이트하는 UI 스레드 (아마도 onCreate())에서 실행되는 Handler 개체를 인스턴스화합니다. 그러면 작업자 스레드가 해당 메시지를 Handler으로 보냅니다.

관련 문제