2015-06-29 2 views
0

В моем приложении у меня есть профиль пользователя пользователя. Если он ранее вошел в систему, я загружаю его с моего сервера, иначе он берет фото с камеры или галереи. В любом случае, я храню его в классе под названием DataStorage в статической переменной общественного Bitmap таким образом:Статический битмап, установленный в null, не остается равным нулю

public class DataStorage { 
. 
. 
    public static Bitmap origProfilePic; //not saved on app close 
. 
. 

Теперь, если пользователь решит вновь сделать свой профиль, я регистрирую его из отправить его обратно к созданию профиля экран, и я призываю:

DataStorage.origProfilePic = null; 

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

Я вошел его п OnCreate функции двух видов деятельности:

onCreate SignUpActivity1, origPic = null 

затем

onCreate SignUpActivity2, origPic = [email protected] 

Но SignupActivity1 называет намерение на SignUpActivity2 и нигде в SiugnupActivity1 нет ссылку на DataStorage.origProfilePic, за исключением моих операторов журнала.

я решил проверить еще раз в SignUpActivity1 при изменении значения, и я нашел ... так же, как я призываю SignupActivity2:

Intent intent = new Intent(SignUpActivity1.this, SignUpActivity2.class); 
    intent.putExtra("EMAIL", email.toString()); 
    intent.putExtra("PASSWORD", password.toString()); 
    startActivity(intent); 
    Log.e("Kibi", "End SignUpActivity1, origPic = " + DataStorage.origProfilePic); 
    finish(); 

Это как-то:

End SignUpActivity1, origPic = [email protected] 

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

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

Может ли кто-нибудь объяснить, что я делаю неправильно, и что лучший способ сохранить этот растровый образ в основном изменчивым способом?

ответ

0

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

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

#SignUpActivity1 
Bitmap origPic = DataStorage.origProfilePic; 

#SignUpActivity2 
Bitmap origPic = DataStorage.origProfilePic; 

Что здесь происходит то, что вы создаете ссылку на DataStorage.origProfilePic. Это означает, что вы практически одинаковы в SignUpActivity1.origPic и SignUpActivity2.origPic.

При вызове этого правила:

startActivity(intent); 

Метод OnCreate в SignUpActivity2 будет вызываться. Вероятно, вы установите здесь (или где-то еще) значение DataStorage.origProfilePic, что означает, что значение SignUpActivity1.origPic и SignUpActivity2.origPic также изменено (не все верно, но будет иметь другой выход).

Также обратите внимание на DataStorage.origProfilePic = null;. Это только устанавливает ссылку на null, но не очищает растровое изображение из памяти. Используйте DataStorage.origProfilePic.recycle();, чтобы очистить растровое изображение от памяти.

+0

Ah - Я думаю, что последний бит об утилизации может быть тем, что я ищу - собираюсь проверить, что сейчас и примет, если это поможет – Kibi

+0

Ahh, нет - не работает, извините, не уверен, что происходит. Я всегда использую DataStorage.origProfilePic напрямую - не назначая другой битмап, чтобы он был равен ему ... теперь, когда II null, я пытаюсь сначала переработать, но, похоже, не помогает – Kibi

+0

Тем не менее, если вы измените статическое значение в ' Значение SignUpActivity2' в переменной SignUpActivity1 изменяется, поскольку они используют одну и ту же ссылку. Не рекомендуется создавать статическую переменную, когда вы используете ее для разных целей/значений. Правда, вы правильно меняете значение 'DataStorage.origProfilePic' в' SignUpActivity2'? –

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