У меня есть следующий код, с помощью которого я пытаюсь сделать снимок и сохранить часть информации о снимке в базе данных. Часть базы данных была тщательно протестирована и отлично работает при любых других обстоятельствах. К сожалению, если я раскомментирую приведенный ниже код, мой код истечет. По какой-то причине, если есть код, следующий за методом this.camera.takePicture()
, takePicture()
вообще не будет вызывать переопределенный метод onPictureTaken
(первое, что он должен сделать, это вывести строку текста, но это не так) даже не делай этого). Если за ним нет кода, он работает нормально.
Перед установкой защелки я получил бы ошибку, потому что ph.getPhoto()
возвращал null
(переменная-член ph's .photo
еще не была установлена в onPictureTaken()
, потому что она еще не была вызвана). После установки фиксатора он будет ждать до истечения времени ожидания (или вечно, если значение времени ожидания не указано).
Может кто-нибудь сказать, что мне не хватает?
public void takePicture(View view) throws Exception {
CountDownLatch latch = new CountDownLatch(1);
System.out.println("Taking Photo!");
PhotoHandler photoHandler = new PhotoHandler(getApplicationContext(),latch);
this.camera.takePicture(null, null, photoHandler);
/* PhotoHandler has an overridden "onPictureTaken()" method which releases the latch as its final
* action; however, its first instruction is to print a confirmation that it has been accessed.
* Unfortunately, for some reason, onPictureTaken() is not called if the following code is
* uncommented; it deadlocks for the five seconds before timing out. However, with out the following,
* the camera.takePicture method invokes onPictureTaken() and it works just fine. */
// latch.await(5,TimeUnit.SECONDS);
// DatabaseHandler db = new DatabaseHandler(this);
// Photo p = photoHandler.getPhoto();
// db.addPhoto(p);
// List<Photo> photos = new ArrayList<Photo>();
// photos.add(p);
// this.addPhotosToMap(photos);
}