在我的应用中,我有一个用户的个人资料照片。如果他以前登录过,我会从我的服务器上下载,否则他会从相机或图库中取出照片。无论哪种方式,我都将它存储在静态公共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?
答案 0 :(得分:0)
在两个活动中使用DataStorage.origProfilePic
时,两个值都会发生变化。由于它是一个静态值,因此两个活动都指向同一个内存对象。
DataStorage.origProfilePic
指向存储位图的一块内存。假设你使用类似的东西:
#SignUpActivity1
Bitmap origPic = DataStorage.origProfilePic;
#SignUpActivity2
Bitmap origPic = DataStorage.origProfilePic;
这里发生的是您创建对DataStorage.origProfilePic
的引用。这意味着您在SignUpActivity1.origPic
和SignUpActivity2.origPic
中实际上具有相同的值。
当您调用此规则时:
startActivity(intent);
将调用SignUpActivity2中的OnCreate方法。您可能会在此处(或其他位置)设置DataStorage.origProfilePic
的值,这意味着SignUpActivity1.origPic
和SignUpActivity2.origPic
的值也会更改(不是全部为true,但会有不同的输出)。
还要小心DataStorage.origProfilePic = null;
。这仅将引用设置为null
,但不清除内存中的位图。使用DataStorage.origProfilePic.recycle();
清除内存中的位图。