마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

Asynctask 사용법 질문입니다.

0 추천

하나의 쓰레드 안에서 비디오 데이터와 음성을 끌어와서 화면에 그리고 음성을 출력해 주고 있는데요.

 

음성 데이터가 클 경우는 다음 그림을 그리는데 갭이 생겨서 Asynctask로 음성부분을 백그라운드에서 출력해주게 하고 있습니다.

 

byte[] videoBuffer = new byte[MAX_VIDEO_SIZE];
Bitmap bmp = Bitmap.createBitmap(nWidth, nHeight, Bitmap.Config.RGB_565);
ByteBuffer buf = null;
Canvas canvas = null;

while(1)
{
          nRet = xxxLib.GetVideoData(videoBuffer, nWidth, nHeight);
          if ( nRet == 0 ) {
                   buf = ByteBuffer.wrap(videoBuffer);
                   bmp.copyPixelsFromBuffer(buf);

                   canvas.drawBitmap(bmp, null, m_dst, null);	

                   playTask = new PlayAudio();
                   playTask.execute();
          }
}
                   

그냥 핵심만 추출한 코드구요.

 

AsyncTask를 상속한 PlayAudio 클래스는 다음과 같습니다.

private class PlayAudio extends AsyncTask<Void, Integer, Void> {
		
		byte[] audioData = new byte[MAX_AUDIO_SIZE];
		@Override
		protected Void doInBackground(Void... arg0) {

			int nRet = xxxLib.GetPCMData(audioData);
			if ( nRet == 0 ) {
				if ( bAudioStart == false ) {
					nAudioDecodeSamplerate = xxxLib.getM_nGetSamplerate();
					nAudioDecodeChannel = xxxLib.getM_nGetChannel();
					nAudioDecodeSize = xxxLib.getM_nGetSize();
					
					if ( nAudioDecodeSamplerate != 0 && nAudioDecodeChannel != 0 && nAudioDecodeSize != 0 )
					{
						Log.d(LibTag, "nAudioDecodeSamplerate: " + nAudioDecodeSamplerate + " nAudioDecodeChannel: " + nAudioDecodeChannel + " nAudioDecodeSize: " + nAudioDecodeSize);
						
						AudioInit();
						
						bAudioStart = true;
					}	
				}
				
				if ( nAudioDecodeSize > 0 )
					audioTrack.write(audioData, 0, nAudioDecodeSize);
			}

			return null;
		}
	}

 

문제는 지금 while() 안에서 클래스를 계속 new 해서 생성하고 실행하는 것입니다.

계속 가비지 콜렉터가 호출되는 상황인데요.

while()위에서 new 하고 실행하면 음성이 안나옵니다.

doinbackground가 끝나고 뭔가 해제에 관한 코드가 돌던가..

new를 한번만 하던가 해야될거 같은데 어떤식으로 사용하는지 검색해봐도 잘 모르겠습니다.

 

도움 부탁드려요..감사합니다.

emerald (760 포인트) 님이 2014년 10월 2일 질문

1개의 답변

+1 추천
 
채택된 답변
AsynchTask는 재사용이 불가 하기 때문에, While 문 밖에서 선언하면 안되는 것 입니다. 코드를 보면, doInBackground만 사용하시고 계신데, 만일  AsynchTask 에서 지원하는 다른 기능을 사요하지 않으신다면, 일반 Thread로 변경하시면 될 것 같습니다.
프로삽질러 (3,040 포인트) 님이 2014년 10월 2일 답변
emerald님이 2014년 10월 2일 채택됨
...