2016-09-19 3 views
1

в MainActivity я поставил изображение моего ImageView Использование Пикассо этим кодом на OnCreate:Переработка и повторное использование ImageView

ivLogo = (ImageView) findViewById(R.id.backimage); 
    Picasso.with(getApplicationContext()).load(R.drawable.background).fit() 
      .into(ivLogo); 

и перерабатывают в On OnDestroy Функция:

((BitmapDrawable)ivLogo.getDrawable()).getBitmap().recycle(); 

я должен Переработать мой ImageView Избегать ошибки OutOfMemory.

, но когда я вернусь к этой деятельности от другого этого кода:

 Intent it = new Intent(WorldChose.this, MainMenu.class); 
     // it.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     startActivity(it); 
     overridePendingTransition(R.anim.from_middle, R.anim.to_middle); 
     finish(); 

Я получаю эту ошибку:

09-19 15:04:32.465: E/AndroidRuntime(2112): java.lang.IllegalArgumentException: Cannot draw recycled bitmaps 

ответ

0

Вы не может использовать переработанный растровое. И кажется, что вы это делаете. Сначала вы перерабатываете растровое изображение, а затем вы связываете его, когда пользователь возвращается к активности.

Из документации:

Caution: You should use recycle() only when you are sure that the bitmap is no longer being used. If you call recycle() and later attempt to draw the bitmap, you will get the error: "Canvas: trying to use a recycled bitmap".

Managing Bitmap Memory

Edit: на Android 3.0 и выше существует не так много причин, чтобы позвонить рециркуляцию. (Read doc)

+0

я хочу повторно использовать ImageView после переработки и заканчивая тем, что деятельность, поэтому ее не представляется возможной, его так же, как запуск активности с начала, не так ли? –

+0

Вы говорите о повторном использовании ImageView, но на самом деле метод утилизации является ТОЛЬКО для растрового изображения. – adalPaRi

+0

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

0

Во-первых, в соответствии с вашим кодом фактически вы вызываете метод перебора для объекта Bitmap.

Во-вторых, как только вы перерабатывают растровое изображение, оно не может быть использовано больше, вы можете проверить исходный код:

private void checkRecycled(String errorMessage) { 
    if (mRecycled) { 
     throw new IllegalStateException(errorMessage); 
    } 
} 

Это фрагмент кода в исходном коде Bitmap, и она будет называться во-первых, в большинстве методов работы Bitmap.

Последние и не в последнюю очередь, метод рецикла на самом деле ничего не делает с утилизацией памяти, если уровень OS API выше 11.

+0

И вам не нужно слишком беспокоиться о проблеме OOM, особенно вы используете Picasso. Потому что ему удается управлять пиковой памятью для вас. – Sherlock

Смежные вопросы