Drawable против Single многоразового растрового изображения лучше с памятью? - PullRequest
20 голосов
/ 12 августа 2011

Насколько я понимаю (не то, что я прав) Drawables обычно корректно удаляются из памяти, когда приложение завершает работу с ними.Однако растровые изображения необходимо перерабатывать вручную, а иногда даже иметь специальный класс, написанный для правильной обработки. Мой вопрос в отношении памяти и утечек: выгоднее ли просто придерживаться Drawables , например:

myView.setBackgroundDrawable(getResources().getDrawable(R.drawable.my_image));
myView1.setBackgroundDrawable(getResources().getDrawable(R.drawable.my_image1));
myView2.setBackgroundDrawable(getResources().getDrawable(R.drawable.my_image2));

, а не чего-то подобного с битмапами:

Bitmap tmpBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.my_image);
myView.setImageBitmap(tmpBitmap);

tmpBitmap.recycle();
tmpBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.my_image1);
myView1.setImageBitmap(tmpBitmap);

tmpBitmap.recycle();
tmpBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.my_image2);
myView2.setImageBitmap(tmpBitmap);
tmpBitmap.recycle();

Я также читал, конечно, что вы должны быть осторожны с методом recycle () в растровых изображениях, потому что они могут быть удалены, пока они еще используются?Кажется, что эти проблемы продолжают появляться в разных формах, но я не могу получить прямой ответ от кого-либо по этому вопросу.Один человек говорит повторное использование растрового изображения и повторное использование после каждого использования, а другие говорят, что используйте Drawables и метод unbindDrawables () (это то, что я использовал):

private void unbindDrawables(View view) {
    if (view.getBackground() != null) {
        view.getBackground().setCallback(null);
    }
    if (view instanceof ViewGroup) {
        for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
            unbindDrawables(((ViewGroup) view).getChildAt(i));
        }
        ((ViewGroup) view).removeAllViews();
    }
}

Любое применимое понимание было бы оченьценится хотя.Спасибо

Ответы [ 2 ]

10 голосов
/ 12 августа 2011

Битовые карты не требуют для ручной переработки. Они собирают мусор так же, как Drawables и другие объекты. Точно так же вам не нужно отвязывать рисованные объекты, за исключением очень специфических ситуаций. Кажется, вы читаете много вводящей в заблуждение информации.

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

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

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

8 голосов
/ 13 августа 2011

Я поддерживаю предложение Ромен, но я не уверен, что ваш вопрос касается вашей реальной проблемы. Я не знаю, как вы справляетесь со ссылками на ваши взгляды. Может быть, у вас просто есть утечки памяти в вашем приложении? Многие утечки памяти в Android связаны с Context. Когда Drawable присоединен к View, View устанавливается как обратный вызов для Drawable.

TextView myView = new TextView(this);
myView.setBackgroundDrawable(getDrawable(R.drawable.my_bitmap));

В приведенном выше фрагменте кода это означает, что Drawable имеет ссылку на TextView, который сам по себе имеет ссылку на Activity (Context), который, в свою очередь, имеет ссылки почти на все, что зависит от твой код.

Не глядя на большую часть вашего кода, я полагаю, что вы на правильном пути, установив обратные вызовы хранимых элементов в null, когда Activity уничтожен.

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