设置为null的静态位图不会保持为空

时间:2015-06-29 10:13:37

标签: android bitmap static null

在我的应用中,我有一个用户的个人资料照片。如果他以前登录过,我会从我的服务器上下载,否则他会从相机或图库中取出照片。无论哪种方式,我都将它存储在静态公共Bitmap变量中的一个名为DataStorage的类中:

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

现在,如果用户决定重新执行他的个人资料,我会将他退出并将其发回给个人资料创建屏幕,然后我致电:

    DataStorage.origProfilePic = null;

(顺便说一下,null是这张图片的合法值 - 我们允许用户没有图片)。配置文件创建通过2个活动 - 首先选择用户名和密码,然后选择图片和其他详细信息。奇怪的是,虽然我将图片变量设置为null,但是当我到达配置文件创建的末尾时,它已经回到了它的原始值,我不知何故有一个用户使用旧的头像(这是他没有选择新图片的情况)

我已经在两项活动的OnCreate功能中记录了它:

onCreate SignUpActivity1, origPic = null

然后

onCreate SignUpActivity2, origPic = android.graphics.Bitmap@42ba7438

但是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 = android.graphics.Bitmap@42ba7438

在这种特殊情况下,这是非常可重复的,但我确实在其他地方将位图设置为null,并且看不到它重新弹出。

我在SO上看到了一些关于静态位图存在内存泄漏危险的事情,虽然我现在没有看到内存泄漏,但我担心如果设置为null则必须做一些非常错误的事情。依靠。

任何人都可以解释我做错了什么,最好的方法是以一种基本上不稳定的方式存储这个Bitmap?

1 个答案:

答案 0 :(得分:0)

在两个活动中使用DataStorage.origProfilePic时,两个值都会发生变化。由于它是一个静态值,因此两个活动都指向同一个内存对象。

DataStorage.origProfilePic指向存储位图的一块内存。假设你使用类似的东西:

#SignUpActivity1
Bitmap origPic  = DataStorage.origProfilePic;

#SignUpActivity2
Bitmap origPic  = DataStorage.origProfilePic;

这里发生的是您创建对DataStorage.origProfilePic的引用。这意味着您在SignUpActivity1.origPicSignUpActivity2.origPic中实际上具有相同的值。

当您调用此规则时:

startActivity(intent);

将调用SignUpActivity2中的OnCreate方法。您可能会在此处(或其他位置)设置DataStorage.origProfilePic的值,这意味着SignUpActivity1.origPicSignUpActivity2.origPic的值也会更改(不是全部为true,但会有不同的输出)。

还要小心DataStorage.origProfilePic = null;。这仅将引用设置为null,但不清除内存中的位图。使用DataStorage.origProfilePic.recycle();清除内存中的位图。