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

카메라 쓰레드 구현 관련 질문

0 추천

안녕하세요~ 안드로이드 초보입니다.

카메라를 쓰레드로 구현하는 중인데, 작동이 안되는 상황은 아니고 궁금한 부분이 있어서 질문드립니다.

일단 아래 코드로 구조를 파악하실 수 있으실 겁니다.

 

public class CameraActivity extends AppCompatActivity {
    CameraView mViewCamera;

    ...

    Camera.PictureCallback mPicture = new Camera.PictureCallback() {

        ...

        mViewCamera.mThreadCam.tCamera.startPreview();
    }
}

class CameraView extends SurfaceView implements SurfaceHolder.Callback {
    CameraThread mThreadCam;

    ...

    public void surfaceCreated(SurfaceHolder surfaceHolder) {
        mThreadCam = new CameraThread(this, mHolder);
        mThreadCam.start();
    }

    ...

    class CameraThread extends Thread {
        Camera tCamera;

        ...

        public void run() {
            tCamera.startPreview();
        }
    }
}

 

안드로이드 카메라 구현해 보신분들 아시겠지만 셔터를 누르면 미리보기는 자동으로 중지되는데

중지된 미리보기를 다시 시작하도록 Camera.PictureCallback() 마지막에 startPreview() 메서드를

다시 호출했구요.

 

제가 궁금한 것은 다시 startPreview() 메서드를 호출 했을 때 카메라 미리보기가

카메라 쓰레드에서 동작하는 것인지 아니면... 

Camera.PictureCallback() 의 startPreview() 메서드는 메인 쓰레드에서 호출된 것이니

메인 쓰레드에서 동작하는 것인지가 궁금합니다.

 

그럼 아시는 분 답변 좀 부탁드릴께요.

미리 감사합니다~

THK (2,360 포인트) 님이 2016년 7월 19일 질문
THK님이 2016년 7월 19일 수정

1개의 답변

+1 추천
 
채택된 답변

startPreview의 경우  JNI를 통해 Camera Thread에 bind되어 동작되는 관계로 Camera Thread에서 동작 될 겁니다.  

단지 가능성이 거의 없긴 하지만 내부 동작의 경우 구글에서 강제하는 부분은 아닌지라 

제조사에서 수정했으면 메인 쓰레드에 동작할 수도 있습니다. 

android.os.Process.myPid();  로  PID를 찍어 로그로 찍어보시는 걸 권장합니다.

익명사용자 님이 2016년 7월 19일 답변
THK님이 2017년 11월 14일 채택됨
우선 답변 감사합니다. 덕분에 모르는 메서드를 많이 배웠습니다.

myPid 는 계속 같은 값이 나와서 확인해보니 myTid 가 쓰레드 더군요.

mViewCamera.mThreadCam.tCamera.startPreview(); 에서 미리보기 재호출은 계속 메인쓰레드와 같은 값이 나오는데, 제 방법이 잘못된 것 같습니다.

해당 코드 바로 밑에서 myTid 를 호출해봤자 당연히 메인쓰레드 영역이니 그러리라 생각되는데요.

startPreview 메서드를 열어서 내부에서 myTid 를 호출할 수도 없고....

말씀하신 로그로 찍어보라는게 어떻게 하는 것인지 구체적인 방법좀 알려주시면 감사하겠습니다.
...