2017-10-11 99 views
0

當我打電話的時候,經常是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

回答

1

內存泄漏。

如果你不使用靜態字段,你不應該擔心內存泄漏。車庫收集器經常查找未引用的變量並自動清理它們。

一旦方法執行完成,分配給方法內部局部變量的新對象就可用於垃圾回收。所以你很樂意去回憶。

但是您使用的是new MainActivity()。你不應該那樣做。

如果你想運行在UI線程的東西,使用的方法runOnUiThreadanyView.post

+0

謝謝,你回答'如果你不使用靜態字段,你不應該擔心內存泄漏'recordHandler類使用靜態。但MainActivity不是靜態的。所以不要擔心內存泄漏? – hyunwooks

+0

我在說靜態字段,而不是靜態類。 –

+0

啊..'私人recordHandler recordHandler = new recordHandler(this);'這裏? – hyunwooks

相關問題