繁体   English   中英

从服务创建的动态视图未收集垃圾

[英]Dynamic Views created from Service not getting Garbage Collected

我正在使用动态视图。 我正在运行服务。 当该服务收到广播时,我将Myview添加到窗口管理器中,并在用户执行某些操作后将其删除。 但是由于服务一直在运行,所以每次广播时,我都会添加此动态视图“ myView”。 问题在于,从窗口管理器中删除它们后,它们并没有得到垃圾回收,并且堆内存分配不断增加。 不知道为什么吗? 由于它里面有位图。 经过5-6次操作后,我得到OutOfMemoryException。

   public class Myservice extends Service{                                                        
       private ParentView myView;
       WakeReceiver receiver;

        @Override
        public void onCreate()
        {
          super.onCreate();
          registerBroadCastReceiver();
        }


        //Performed when broadcast recieved
        public void addLayout() {
           WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
           myView = new ParentView(this);
           windowManager.addView(myView, getLayoutParam());

        }

        //Performed when user performs action on ParentView
        public void removeLayout() {
           WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
           windowManager.removeView(myView);

        }

         private void registerBroadCastReceiver() {
             IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF);

             receiver = new WakeReceiver();
             registerReceiver(receiver, filter);

        }

         private WindowManager.LayoutParams getLayoutParam() {
                 WindowManager.LayoutParams localLayoutParams = new     WindowManager.LayoutParams();

                 localLayoutParams.width = WindowManager.LayoutParams.MATCH_PARENT;
                 localLayoutParams.height = (int) (WindowManager.LayoutParams.MATCH_PARENT);
                 return localLayoutParams;

        }


}

//父视图的代码

 public class ParentView extends RelativeLayout {


      MyService topService;  

      public ParentView(MyService topService) {
         super(topService);
         this.topService = topService;
         LayoutInflater.from(topService).inflate(R.layout.parent_layout, this);                 

           setBackgroundDrawable(topService.getResources()
              .getDrawable(R.drawable.sample_image));
       }

       @Override
       public boolean onTouchEvent(MotionEvent event) {
         topService.removeLayout();  
      }



}

使用system.gc(); 这对我有帮助。 它调用垃圾收集器。 试试看,如果有效,请回复我。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM