Я попытался загрузить свой пользовательский интерфейс, используя растровые изображения, получающие исключение OutOfMemory. Раньше я использовал PNG, затем я преобразовал их в GIF, чтобы уменьшить использование памяти, загрузив растровые изображения. Общее количество изображений составляет 291kb (при использовании PNG оно составляло около 2,2 МБ).Исключение OutOfMemory при загрузке пользовательского интерфейса через растровые изображения
Я использую этот код, используя inSampleSize для загрузки изображений, если изображения намного больше, чем размер экрана:
public void loadViewImage(View view, int drawableID) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), drawableID, options);
options.inSampleSize = calculateInSampleSize(options, view.getWidth(), view.getHeight());
options.inJustDecodeBounds = false;
view.setBackgroundDrawable(new BitmapDrawable(BitmapFactory.decodeResource(getResources(), drawableID, options)));
}
public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
while (height/inSampleSize > reqHeight || width/inSampleSize > reqWidth) {
final int halfHeight = height/2;
final int halfWidth = width/2;
// Calculate the largest inSampleSize value that is a power of 2 and keeps both
// height and width larger than the requested height and width.
while ((halfHeight/inSampleSize) >= reqHeight
&& (halfWidth/inSampleSize) >= reqWidth) {
inSampleSize *= 2;
}
}
return inSampleSize;
}
Изображение затем загружается через:
final RelativeLayout backgroundLayout = (RelativeLayout)findViewById(R.id.backgroundLayout);
backgroundLayout.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom,
int oldLeft, int oldTop, int oldRight, int oldBottom) {
loadViewImage(backgroundLayout, R.drawable.background);
}
});
Это приложение работает на Samsung Galaxy S7 Edge, но не на LG G2. При использовании inSampleSize 2 это происходит, но мне интересно, как эти 291kb-изображения используют столько памяти.
Любая помощь очень ценится.
Прежде всего, это гораздо более простой способ сделать это с помощью 'Picasso' для Android, или если вы по-прежнему хотите получить его по-своему, используйте все тяжелые логики для масштабирования и расчета битмапов от подсказки потока пользовательских интерфейсов' AsyncTask ' –
* 291kb images * no, они не берут такого размера, когда они загружаются в виде растрового изображения ... еще раз: ** РАЗМЕР ФАЙЛА НЕ СОБИРАЕТСЯ ** – Selvin
' Всего изображений 291kb'. Более уместно разрешение изображений. Поскольку использование растровых изображений в памяти зависит от разрешения. Теперь у вас нет разрешения под управлением, если вы используете BitmapFactory.decodeResource(), так как битмап будет адаптирован к screan. Вы можете лучше декодировать из обычного входного потока. – greenapps