【问题标题】:Activity not destroying to release Heap in android?Activity 不会破坏以在 android 中释放堆?
【发布时间】:2013-11-29 12:00:39
【问题描述】:

我试图通过销毁当前活动来释放堆大小,同时转到另一个活动。

我在backPreess()上使用finish();

但这并没有释放堆。

on setContentView()

堆大小增加 16Mb。我想在进行另一个活动后释放堆中的这种增加。任何人都可以帮助如何做到这一点?

我的代码如下:

    package com.stancil.levels;        
    public class PaintActivity extends ZebraActivity implements
            PaintView.LifecycleListener, PaintView1.LifecycleListener1 {

        private static final int REQUEST_PICK_COLOR = 1;

        ....
....
    public PaintActivity() {
            _state = new State();
        }

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            Constants.context = getApplicationContext();


            setContentView(R.layout.paint);
            ..................
    ...................
    ...............

        }


        public void onPreparedToLoad() {
            // We need to invoke InitPaintView in a callback otherwise
            // the visibility changes do not seem to be effective.
            new Handler() {
                @Override
                public void handleMessage(Message m) {
                        new InitPaintView();

                    Log.v("PaintActivity", "After InitPaintView Called");
                }
            }.sendEmptyMessage(0);
        }


        private class InitPaintView implements Runnable {
            private Bitmap _originalOutlineBitmap;
            private Handler _handler;

            public InitPaintView() {
                // Make the progress bar visible and hide the view

                _paintView.setVisibility(View.GONE);
                _progressBar.setProgress(0);
                _progressBar.setVisibility(View.VISIBLE);
                _state._savedImageUri = null;
                _state._loadInProgress = true;

                _originalOutlineBitmap=_imageBitmap;
                _handler = new Handler() {
                    @Override
                    public void handleMessage(Message m) {
                        switch (m.what) {
                        case Progress.MESSAGE_INCREMENT_PROGRESS:
                            // Update progress bar.
                            _progressBar.incrementProgressBy(m.arg1);
                            break;
                        case Progress.MESSAGE_DONE_OK:
                        case Progress.MESSAGE_DONE_ERROR:
                            // We are done, hide the progress bar 
                            // the paint view back on.
                            _state._loadInProgress = false;
                            _paintView.setVisibility(View.VISIBLE);
                            _progressBar.setVisibility(View.GONE);
                            initiatePopupWindow();
                            break;
                        }
                    }
                };

                new Thread(this).start();

            }

            public void run() {
                Log.v("Wasimmmmmmmmmmmmmmmm", "qqqqq 22");
                _paintView.loadFromBitmap(_originalOutlineBitmap, _handler);
            }

        }



        private static class State {
            // Are we just loading a new outline?
            public boolean _loadInProgress;

            // The resource ID of the outline we are coloring.
            //public int _loadedResourceId;
            //
            // If we have already saved a copy of the image, we store the URI here
            // so that we can delete the previous version when saved again.
            public Uri _savedImageUri;
        }







        @Override
            public void onBackPressed() {
                new AlertDialog.Builder(this)
                .setTitle("Exit")
                .setMessage("Do you want to go to Main Menu?")
                .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {

                         Constants.check_new=true;
                       Intent i=new Intent(PaintActivity.this,MainActivity.class);
                      // i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                       startActivity(i);
                       finish();
                       overridePendingTransition(R.anim.fade_in, R.anim.fade_out);

                    }
                }).setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        // Do nothing.
                    }
                }).show();
         }
}

    }

【问题讨论】:

  • 下次请尽量用正确的英文写作。例如,'This' 拼写为 s 而不是 z。祝你好运!

标签: android android-activity heap-memory activity-finish ondestroy


【解决方案1】:

在 onDestroy 方法中释放 yoru 对象,无论如何,如果没有对已销毁活动的引用,GC 将在需要时自动清理(不需要在您关闭活动后立即发生)。 或者,有一种强制运行 GC 的方法,但我什至不会写它,因为它不是典型应用程序应该使用的真正特性

【讨论】:

  • 我使用 Log.v("onPainiActivyt","onDestrou");...byt 此日志未显示在日志中 Cat on to another activity..即使我使用 finish() 但 Log没有被执行
  • onDestroy() 仅在资源不足时由操作系统调用,并且如果最终将您的活动释放为释放内存。这将帮助您理解这个概念:stackoverflow.com/questions/4449955/活动-ondestroy-从不调用
猜你喜欢
  • 1970-01-01
  • 2015-05-16
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 2013-12-17
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
相关资源
最近更新 更多