我整个星期都在研究 android 堆内存控制。
故事是我们将登录屏幕背景更改为更高清的内容。这造成了严重的问题。它比以前消耗更多的内存,所以其余的活动,特别是从它打开一个大图像时,会导致内存不足的问题。
用DDMS分析后,终于找到了解决办法。我在图像启动时添加了位图控件,并在用户离开活动时回收它。这是我的代码:
protected void findByViews() {
//Find all widgets view on the layout by ID
background = (RelativeLayout) findViewById(R.id.mainTableLayout);
Bitmap bm = BitmapFactory.decodeResource(this.getResources(), R.drawable.pbackground);
BitmapDrawable bd = new BitmapDrawable(this.getResources(), bm);
background.setBackgroundDrawable(bd);
}
当用户离开或停止活动时:
public void onPause() {
super.onPause();
java.lang.System.out.println("MAIN onPause");
//Clear Image from Heap.
BitmapDrawable bd = (BitmapDrawable)background.getBackground();
background.setBackgroundResource(0);
bd.setCallback(null);
bd.getBitmap().recycle();
}
通过这样做,应用程序的其余部分将在大约 40%-50% 的可用内存下运行。之前它只运行不到 10%。
然而,这并不是一个好的结局。我遇到了另一个问题。我有一个功能可以让用户注销并返回主屏幕。然而,登录屏幕本身需要大约 80% 的堆空间才能运行。在运行时(登录后),其余活动需要大约 50%-60% 才能运行。
简而言之,我只是没有足够的堆内存来从运行时再次午餐主屏幕!
这是退出和重新午餐时的代码:
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
String serviceType = intent.getStringExtra("serviceType").trim();
System.out.println("serviceType:" + serviceType);
if (serviceType.equals("exit")) {
AlertDialog.Builder alertDialog = new AlertDialog.Builder(
getCurrentActivity());
alertDialog.setTitle("Logout");
alertDialog.setMessage("Do you want to logout?");
alertDialog.setPositiveButton("Yes",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int which) {
// Unreg from App server so do not receive
// notification when logout
MultiData.getMultiData().serverLogOut();// never
// serverlogout
// before
// DeviceRegistrar.unregisterWithServer
ImageManagerMemCache.INSTANCE.clear();
Intent intent = null;
intent = new Intent(getCurrentActivity(),
main.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
// intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
});
alertDialog.setNegativeButton("No",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int which) {
// here you can add functions
}
});
alertDialog.show();
}
我该如何改进这些代码,以释放应用程序堆的所有内存,然后从头开始重新启动主要活动?或者只有我能做的就是减少登录屏幕的内存使用(我怀疑这真的很难)。
谢谢!