Android, озабоченность размером кучи виртуальных машин - PullRequest
0 голосов
/ 06 апреля 2011

После некоторого тестирования с готовым продуктом я только что обнаружил, что у всех моих аппаратных устройств большие виртуальные кучи.

Минимальное значение - 32 МБ.

Мое приложение требует большого объема памяти.Приложение, которое загружает кучу высококачественных альфа-изображений и рисует их на холсте в виде анимации.Может быть загружено до двух наборов этих файлов (один для текущей анимации и один для следующей)

Теперь я обеспокоен тем, что уменьшил размер кучи виртуальной машины на одном из моих устройств до 16 МБ, которые он выиграл 't на самом деле работают на устройствах с таким маленьким размером кучи.

Поскольку я не могу многое сделать с размером изображений, и мало что могу сделать, чтобы уменьшить количество изображений, я спрашиваю, как быЯ иду к достижению того же результата с менее строгими ограничениями памяти?

Спасибо

Ответы [ 2 ]

0 голосов
/ 06 апреля 2011

Вы можете использовать этот метод для декодирования изображений.Это может сделать их намного легче.Помните, что изображения становятся растровыми, когда они отображаются, увеличивая потребление памяти.

public static Bitmap decode(byte[] imageByteArray, int width, int height) {
    // Decode image size
    BitmapFactory.Options o = new BitmapFactory.Options();
    o.inJustDecodeBounds = true;
    BitmapFactory.decodeByteArray(imageByteArray, 0, imageByteArray.length,
            o);

    // Find the correct scale value. It should be the power of 2.
    int width_tmp = o.outWidth, height_tmp = o.outHeight;
    int scale = 1;
    while (true) {
        if (width_tmp / 2 < width || height_tmp / 2 < height)
            break;
        width_tmp /= 2;
        height_tmp /= 2;
        scale *= 2;
    }

    // Decode with inSampleSize
    BitmapFactory.Options o2 = new BitmapFactory.Options();
    o2.inSampleSize = scale;
    o2.inTempStorage = new byte[Math.max(16 * 1024, width * height * 4)];
    return BitmapFactory.decodeByteArray(imageByteArray, 0,
            imageByteArray.length, o2);

    // return BitmapFactory.decodeByteArray(imageByteArray, 0,
    // imageByteArray.length);
}

, где

width - максимальная ширина в пикселях, которую может иметь imageView.высота - максимальная высота в пикселях, которую может иметь imageView.

Таким образом, растровое изображение станет светлее, а приложение может потреблять меньше памяти.

(ПРИМЕЧАНИЕ. Я скопировал этот метод и изменил егонемного, я не помню первоначальный вопрос, поэтому я не могу поставить URL)

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

Теперь, как говорит Джеймс Л., лучше всего хранить изображения в файловой системе и переносить их в память только при необходимости, но если вы этого не сделаете (мой случай).Вы можете загружать изображения с помощью:

public static byte[] getBytes(InputStream is) throws IOException {

    int len;
    int size = 1024;
    byte[] buf;

    if (is instanceof ByteArrayInputStream) {
        size = is.available();
        buf = new byte[size];
        len = is.read(buf, 0, size);
    } else {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        buf = new byte[size];
        while ((len = is.read(buf, 0, size)) != -1)
            bos.write(buf, 0, len);
        buf = bos.toByteArray();
    }
    return buf;
}

public static byte[] downloadFileByteArray(String fileUrl)
            throws IOException, MalformedURLException {

    URL myFileUrl = null;

    myFileUrl = new URL(fileUrl);

    HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection();
    conn.setDoInput(true);
    conn.connect();
    InputStream is = conn.getInputStream();

    return getBytes(is);
}

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

Кроме этого(и вызывая System.gc ()), вы мало что можете сделать (что я знаю).Может быть, удалив BMP в onPause () и onDestroy () и восстановив их в onResume (), если это необходимо.

0 голосов
/ 06 апреля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...