Браузер изображений в BlackBerry - PullRequest
2 голосов
/ 02 сентября 2011

Я хочу сделать браузер изображений для своего приложения, где пользователь может выбрать нужное изображение с телефона.Я читаю каждое изображение с телефона следующим образом:

FileConnection fileConnection = (FileConnection)Connector.open((String) imm.elementAt(i));
InputStream inputStream = fileConnection.openInputStream();
byte[] imageBytes = new byte[(int)fileConnection.fileSize()];
inputStream.read(imageBytes);
inputStream.close();
fileConnection.close();

EncodedImage image = EncodedImage.createEncodedImage(imageBytes, 0, -1);
EncodedImage image1 = scaleImageEncoded.scaleImage(image, (int) (Display.getWidth() / 4) - 10, (int) (Display.getWidth() / 4) - 10);
BrowseBitmapField field = (BrowseBitmapField) manager.getField(i);
field.setBitmap(image1.getBitmap());
field.setEncodedImage(image);

Когда в телефоне много изображений, этот процесс происходит слишком медленно, и телефону требуется много времени, чтобы их получить.Есть ли какой-нибудь более быстрый способ прочитать изображение из памяти телефона и отобразить его?

Заранее спасибо

Ответы [ 3 ]

3 голосов
/ 03 сентября 2011

В дополнение к тому, что рекомендует jprofitt, я бы предложил сделать следующее:

  1. Когда вы создаете версию изображения с измененным размером, вы можете сохранить его для использования в будущем.В следующий раз, когда пользователь нажимает на то же изображение, вы сначала проверяете наличие изображения с измененным размером, а если его нет, то только читаете / изменяете размер исходного изображения.Таким образом, вы можете сэкономить время, затрачиваемое на изменение размера в будущем + не забывайте, что размер файла изображения с измененным размером в разы меньше исходного, поэтому чтение в будущем будет происходить в разы быстрее.

  2. Не пытайтесьпрочитать / изменить размер всех изображений в каталоге сразу.Делайте это только для тех, которые должны быть видны пользователю в данный момент.Например, если в директории 100 изображений, вам, скорее всего, потребуется ОЧЕНЬ много времени, чтобы прочитать / изменить размер / прикрепить к менеджеру все изображения.Однако пользователь видит только 6 или 8 изображений на экране одновременно.Если пользователь прокручивает вверх / вниз, то самое время запросить чтение / изменение размера / и т. Д. Для тех изображений, которые теперь должны быть видимы, но еще не были прочитаны / изменены.

  3. Чтение /изменение размера должно выполняться на фоне Thread, чтобы не блокировать основной поток пользовательского интерфейса.Другими словами, пользователь должен иметь возможность прокручивать экран, когда чтение / изменение размера происходит на фоне Thread.Я рекомендую организовать очередь задач чтения / изменения размера и выполнить их в фоновом режиме Thread.Когда задача выполнена на рабочем Thread и пришло время обновить интерфейс экрана с измененным размером изображения, используйте для этого UiApplication.invokeLater(Runnable action).

2 голосов
/ 02 сентября 2011

Вы можете попробовать использовать BufferedInputStream. Мне повезло, что это ускорило мое время чтения, может сработать и для вас.

 BufferedInputStream inputStream = new BufferedInputStream(fileConnection.openInputStream());
 byte[] imageBytes = new byte[(int)fileConnection.fileSize()];
 inputStream.read(imageBytes, 0, imageBytes.length);
1 голос
/ 02 сентября 2011

Парень, который разместил по указанному ниже URL-адресу, понял, что вы можете получить миниатюру в BBThumbs.dat и опубликовал некоторый код.Я сам не пробовал, но если это работает, экономия времени должна быть очень значительной.

http://supportforums.blackberry.com/t5/Java-Development/Thumbnails-work-around/td-p/343870

...