2011-02-28 4 views
3

카메라 표면 미리보기에서 프레임 버퍼를 캡처하고 해당 버퍼를 웹의 어딘가에서 처리/게시 할 다른 기능으로 보내려합니다. http://developer.android.com/reference/android/os/AsyncTask.htmlAsyncTask를 올바르게 사용하는 방법

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { 
    protected Long doInBackground(URL... urls) { 
     int count = urls.length; 
     long totalSize = 0; 
     for (int i = 0; i < count; i++) { 
      totalSize += Downloader.downloadFile(urls[i]); 
      publishProgress((int) ((i/(float) count) * 100)); 
     } 
     return totalSize; 
    } 

    protected void onProgressUpdate(Integer... progress) { 
     setProgressPercent(progress[0]); 
    } 

    protected void onPostExecute(Long result) { 
     showDialog("Downloaded " + result + " bytes"); 
    } 
} 
다음

당신이 그것을 실행하는 방법은 다음과 같습니다 :

new DownloadFilesTask().execute(url1, url2, url3); 

은 즉이 모든 작업을 하나의 큰 AsyncTask를 (가가는 그 루프는

안드로이드 개발자 가이드는이 예제를 제공합니다 거기에 앉아서 각 파일이 동 기적으로 다운로드 될 때까지 대기) 전체 작업이 백그라운드에서 작동하는지 아니면 전달 된 각 URL에 대해 여러 스레드를 시작하겠습니까?

내 프로젝트와 관련하여 프레임 버퍼를 캡처하기 위해 매번 새로운 AsyncTask를 만드는 것이 합리적일까요?

//for each frame buffer i want to process: 
    new FrameProcessorTask().execute(byte[]); 

답변

3

데이터를 순환하는 하나의 스레드입니다.

후자도 할 수 있습니다.

두 번째 옵션을 사용하면 핸드셋의 메모리가 제한되어 있고 병렬 스레드가 많기 때문에 힙 크기를 고려해야합니다. 큰 버퍼로 다운로드하면 사용 가능한 메모리가 초과 될 수 있습니다.

+0

프레임이 떨어져있을 것입니다. 처리는 단순히 ARGB 비트 맵으로 변환하는 것입니다.이 간격을 사용하면이 문제가 발생할 가능성이 줄어 듭니다. 다음 스레드가 시작되기 전에 각 스레드가 [업로드하지 않으면 적어도 처리를 완료 할 수 있습니다.] –

4

관리되는 스레드 풀에서 가져온 단일 스레드입니다. 인수 줄임표는 단순히 doInBackground 메소드의 입력입니다. 예제에서 알 수 있듯이 거기에 스레드가 생성되지 않습니다. URL 당 하나의 스레드를 사용하려면 각각에 대해 새 AsyncTask을 만들어야합니다.

관련 문제