Я работаю над модификацией примера Camera2 API от Google для Android, здесь: https://github.com/googlesamples/android-Camera2BasicHandlerThread блоки UI андроид
Я загрузки отснятых изображений Cloudinary, и, очевидно, нужно сделать это в фоновом потоке, поэтому пользовательский интерфейс не блокируется.
Проблема, с которой я столкнулся, заключается в том, что пользовательский интерфейс фактически блокируется, когда изображение загружается, хотя из того, что я понимаю, это не должно быть, потому что обработчик создается с помощью Looper из фона нить так:
private void startBackgroundThread() {
mBackgroundThread = new HandlerThread("CameraBackground");
mBackgroundThread.start();
mBackgroundHandler = new Handler(mBackgroundThread.getLooper());
}
класс ImageSaver, который отвечает за запись образа на диск, выглядит следующим образом:
private static class ImageSaver implements Runnable {
/**
* The JPEG image
*/
private final Image mImage;
/**
* The file we save the image into.
*/
private final File mFile;
public ImageSaver(Image image, File file) {
mImage = image;
mFile = file;
}
@Override
public void run() {
ByteBuffer buffer = mImage.getPlanes()[0].getBuffer();
byte[] bytes = new byte[buffer.remaining()];
buffer.get(bytes);
FileOutputStream output = null;
try {
output = new FileOutputStream(mFile);
output.write(bytes);
InputStream is = new ByteArrayInputStream(bytes);
Map uploadResult = CloudinaryManager.getInstance().uploader().upload(is, ObjectUtils.asMap(
"api_key", CloudinaryManager.CLOUDINARY_API_KEY,
"api_secret", CloudinaryManager.CLOUDINARY_SECRET_KEY
));
System.out.println("result");
} catch (IOException e) {
e.printStackTrace();
} finally {
mImage.close();
if (null != output) {
try {
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
ImageSaver добавляется к обработчику здесь:
private final ImageReader.OnImageAvailableListener mOnImageAvailableListener
= new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
mBackgroundHandler.post(new ImageSaver(reader.acquireNextImage(), mFile));
}
};
Я хотел бы получить любую помощь или совет, чтобы указать мне в правильном направлении.
Вы, кажется, правильно использовать HandlerThread, ошибка может быть где-то еще ...? –
показать стопку, пожалуйста, журнал ошибок. Мы здесь не в гадании. –