2013-12-18 1 views
0

나는 배경 구성 작업 (UI 구성 요소에서 필요한 경우 포함)을 정상적으로 중지시키기위한 소멸자가있는 C++ 배경이 더 많습니다. 저는 wav 파일을 시각적으로 렌더링하고 싶은 작은 안드로이드 프로젝트를 만들고 있습니다. 나는 어떤 라이브러리를 사용하는 것에 관심이 없으며, 다른 어떤 것보다 더 많은 운동을합니다.Android View 객체는 백그라운드 스레드를 관리하는 것이 일반적입니까?

효과적으로 WavFile 개체 (내가 작성한 작은 RIFF 구문 분석 프레임 워크를 사용하여 설계 한 개체)를 제공 할 수있는 View 개체를 만들려고합니다. 이 View 구성 요소의 목표는 다양한 줌 레벨에서 파형을 렌더링 할 수 있도록하는 것입니다.

주 뷰 개체 (WavView)는 HorizontalScrollView를 확장하고 단일 파형 렌더러 자식을가집니다. 아이디어는 확대/축소 비율이 증가함에 따라 자식이 가로로 커질 수 있기 때문에 확대 된 파형을 스크롤 할 수 있습니다.

확대/축소 비율이 증가함에 따라보기는 읽는 샘플의 축소 범위를 줄입니다. 감소 범위가 500 인 경우, 감소 된 데이터 세트의 각 샘플은 감소됩니다 [0] = 평균 (소스 [0, 499]), 감소 [1] = 평균 (소스 [500, 999] 는 WavView 객체의 너비를 기반으로 동적으로 계산되므로 기본적으로 확대/축소 비율은 1입니다. 즉 파형이 WavView 내부에 정확하게 들어 맞습니다 (예 : 스크롤하지 않음).

이것은 줌 비율이나 부모 너비가 변경 될 때마다 웨이브 파일을 읽고 줄이기 범위를 기반으로 모든 축소를 수행해야한다는 것을 의미합니다. 데이터 구문 분석을 위해 설계 한 프레임 워크는 해당 데이터를 재생할 때도 유용해야합니다. wav PCM 샘플은 리틀 엔디안이므로이 프레임 워크는 재생과 함께 사용할 수 있도록 빅 엔디안으로 변환합니다.

이 모든 것은 저렴하지 않으며 별도의 스레드에서 수행해야합니다. 모든 유형의 기능을 캡슐화하여 웨이브 파일을 전달하고 렌더링 할 수있게하고 싶습니다. 샘플을 줄이면 부모는 진행 표시기를 표시하고 완료되면 렌더링 된 파형을 표시합니다.

하지만 내가 설정 한 다른 파일 또는 활동이 죽거나 단순히 레이아웃 트리에서 뷰가 제거되는 경우를봤을 때 분명히 스레드를 중지해야합니다. 안드로이드 뷰가 일반적으로 구현하는 것입니까? 다른 방법으로해야합니까? 최대한 많은 캡슐화를 유지하고 싶습니다.

EDIT : AsyncTask는이 작업을 수행하는 데 유용한 것으로 보입니다.

답변

1

안드로이드 뷰가 일반적으로 구현하는 것입니까?

아니요,보기가 전혀 스레딩을 처리하지 못합니다. 안드로이드의 뷰는 MVP 관점의 뷰입니다. 그들은 전달 된 데이터로 매우 신속하게 렌더링 할 수 있어야하며 복잡한 비즈니스 로직을 실제로 "인식하지"않아야합니다. 당신이 말했듯이, 스레딩없이 파형을 해석하면 시스템이 망가질 것이기 때문에 아마도 파형을보기로 전달하는 것은 의미가 없을 것입니다.

파형을 취할 수있는 발표자를 작성하고 배경 스레드의 비트 맵으로 렌더링하는 것이 더 나을 것입니다. 발표자가 완성 된 비트 맵을보기에 게시하여 매우 빠르게 렌더링 할 수있는 방식으로이를 사용자 정의보기에 바인딩 할 수 있지만 발표자는 항상 다음 파형을 다른 스레드의 다른 비트 맵에 쓰려고합니다. 이 발표자는 Activity 또는 Fragment 라이프 사이클에 바인딩되어야하며 뷰를 제거, 확대/축소 또는 크기 조정하는 것과 같은 작업을 처리해야합니다.

+0

답장을 보내 주셔서 감사합니다. 이것은 실제로 내가 파일을 파싱하고 비트 맵으로 그리는 것을 처리 할 계획이었습니다. 왜냐하면 onDraw 중에 수백 포인트의 경로를 그리는 것이 저렴하지 않기 때문입니다. 나는 그 부분을 언급하지 않았다는 것을 깨닫지 못했다. (이미 많은 텍스트가있다.) 각 뷰 인스턴스가 별도의 드로잉 드로잉 스레드를 관리해야하는지 여부를 파악하고 있었지만, 단일 작업 큐가 각 파싱을 처리하고 동시에 많은 작업을 처리하는 것이 더 나을지도 모른다. –

관련 문제