0

我整个星期都在研究 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();
        }

我该如何改进这些代码,以释放应用程序堆的所有内存,然后从头开始重新启动主要活动?或者只有我能做的就是减少登录屏幕的内存使用(我怀疑这真的很难)。

谢谢!

4

0 回答 0