是否发生memoryleak在Handler中调用方法时使用new运算符?

问题描述:

当我打电话的时候,经常是new运营商。 最近我有1个问题。是否发生memoryleak在Handler中调用方法时使用new运算符?

在处理程序中使用new运算符调用方法时是否存在问题?

首先请看看源

public clas MainActivity extends Activity { 
    private final static int MSG_START = 1000; 
    private fian lstatic int INTERVAL = 300000;/5 MIN 

    private recordHandler recordHandler = new recordHandler(this); 

    //click record button 
    @Override 
    public void onClick(View v) { 
     recordHandler.sendEmptyMessage(RECORD_START); 
    } 

    private static final class recordHandler extends Handler { 
      private final WeakReference<MainActivity> weak; 

      public recordHandler(MainActivity act) { 
       weak = new WeakReference<>(act); 
      } 

      public void handleMessage(Message msg) { 
       MainActivity act = weak.get(); 

       if (act != null) { 
       switch (msg.what) { 
        case RECORD_START: 
         //do record start 
         new MainActivity().startRecord(); 
         new MainActivity().recordHandler.sendEmptyMessageDelayed(MSG_START, INTERVAL); 
         break; 
       } 
       } 
      } 
      private static final Runnable runnable = new Runnable() { 
       @Override 
       public void run() { 

       } 
      }; 
    } 

这个来源,当用户点击录制按钮,开始记录每5分。

无论如何,我想重构以防止内存泄漏。

也许,new运算符发生memoryleak?

使用new运算符调用处理程序内部的方法时会出现问题吗?

感谢阅读:)如果你把在静态字段中的一些对象,却忘了让空使用它后,会出现

+0

是什么让你觉得你有内存泄漏?什么让你的东西GC不会处理它? – John3136

内存泄漏。

如果你不使用静态字段,你不应该担心内存泄漏。车库收集器经常查找未引用的变量并自动清理它们。

一旦方法执行完成,分配给方法内部局部变量的新对象就可用于垃圾回收。所以你很乐意去回忆。

但是您使用的是new MainActivity()。你不应该那样做。

如果你想运行在UI线程的东西,使用的方法runOnUiThreadanyView.post

+0

谢谢,你回答'如果你不使用静态字段,你不应该担心内存泄漏'recordHandler类使用静态。但MainActivity不是静态的。所以不要担心内存泄漏? – hyunwooks

+0

我在说静态字段,而不是静态类。 –

+0

啊..'私人recordHandler recordHandler = new recordHandler(this);'这里? – hyunwooks