내 TakePic
클래스에서 AsyncTask를 실행하고 있습니다. doInBackground
기능에서 나는 Camera.takePicture
기능을 사용하고 있습니다. 이제 모든 것이이 시점에서 괜찮습니다. 사진을 찍고 그 위치를 /sdcard/%d.jpg에 저장하고 있습니다.doInBackground Android 실행 후 AsyncTask가 완료되지 않습니다.
public class TakePic extends AsyncTask<CameraPreview, String, Integer> {
@Override
protected Integer doInBackground(final CameraPreview... params) {
params[0].camera.takePicture(null,null,new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
FileOutputStream outStream = null;
try {
outStream = new FileOutputStream(String.format("/sdcard/%d.jpg", System.currentTimeMillis()));
outStream.write(data);
outStream.close();
Log.e("picture_saved", "Picture has been saved succesfully: " + data.length);
camera.release();
} catch (FileNotFoundException e) {
e.printStackTrace();
Log.e("file_not_found: ","couldn't save the file "+e.getMessage());
} catch (IOException e) {
e.printStackTrace();
Log.e("IOexception: ","couldn't save the file "+e.getMessage());
}
}
});
Log.e("doinback_compt:" ,"done");
return 0;
}
@Override
protected void onPostExecute(Integer integer) {
}
}
그러나 주 클래스에서이 AsyncTask를 실행하면 완료되지 않습니다. 다른 함수를 실행해야하고이 AsyncTask가 끝날 때까지 기다려야합니다. 그래서 AsyncTask를 실행 한 후에 while 루프를 사용하여 작업의 상태를 확인하지만 상태는 변하지 않습니다.
TakePic backCam=new TakePic();
backCam.execute(cameraPreview_front);
while (backCam.getStatus()!= AsyncTask.Status.FINISHED){
*waiting for async task to finish*
}
그것은 while 루프 정상을 실행 doInBackground 내 로그 캣 쇼에 갇혀, 그리고 파일이 해당 위치에 저장됩니다.
10-10 18:06:14.497 15975-15975/com.urun.camera_test E/clicked_capture:: ok
10-10 18:06:14.633 15975-16452/com.urun.camera_test E/doinback_compt:: done
그래서 무엇을해야합니까? 미리 감사드립니다.
왜 그것이 끝나지 않았다고 생각합니까? – xAqweRx
while 루프에서 부정확 한 체크를 한 것 같습니다. 그리고 이것 때문에 * 비동기 태스크 대기 중 *이 정상적으로 작동하지 않습니다. – xAqweRx
'while' 루프가 UI 스레드를 효과적으로 차단하기 때문에 'AsyncTask'를 사용하는 것은 잘못된 방법입니다. 'AsyncTask'가 완료된 후에 실행할 코드를 onPostExecute()로 옮깁니다. – Egor