2016-10-03 49 views
0

我的一個類有兩個處理程序以固定的時間間隔發送消息。這個類在其中一個活動中被實例化。下面是代碼:Handler runnable多次運行

public class MyClass { 

    private Boolean started = false; 
    private Handler handler1 = new Handler(); 
    private Handler handler2 = new Handler(); 
    private Runnable runnable1 = new Runnable() { 
      @Override 
      public void run() { 
       sendMessage("blah"); 
      } 
     }; 
    private Runnable runnable2 = new Runnable() { 
      @Override 
      public void run() { 
       sendMessage("blah blah"); 
       if (started) { 
        triggerMessageSending(); 
       } 
      } 
     }; 
    } 

    public void startMessageSending(){ 
     triggerMessageSending(); 

    } 

    private void triggerMessageSending(){ 
     started = true; 
     handler1.postDelayed(runnable1, 500); 
     handler2.postDelayed(runnable2, 1000); 
    } 

    public void stopMessageSending(){ 
     started = false; 
     handler1.removeCallbacks(runnable1); 
     handler2.removeCallbacks(runnable2); 
    } 

} 

這裏是我的活動:

public class MyActivity extends Activity { 

private MyClass myClass; 

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

     myClass = new MyClass(); 
     myClass.startMessageSending(); 

} 

@Override 
    protected void onStop() { 
     super.onStop(); 
     myClass.stopMessageSending(); 
} 
} 

,一切工作正常進行的第一次。如果我按下按鈕並轉到上一個活動並再次返回(不退出應用程序),則會調用sendMessage方法兩次。如果我再做一次,這會變成三。它會在不退出應用程序的情況下多次調用此方法。如果我退出應用程序並再次執行此操作,則它第一次可以正常工作。

這是什麼原因?我錯在哪裏?

+0

我不確定,但嘗試在'onStop()'方法中設置'myClass = null;'。 –

+0

試過了..不工作 – NewOne

+0

試着用'static' myClass對象。 –

回答

0

不確定您的業務邏輯,但這些是我可以在代碼中看到的問題。

  • 如果Runnable兩者都做同樣的工作(sendMessage)什麼是具有兩個可運行的地步?
  • 在第二個Runnable runnable2中,再次完成相同。唯一的區別是boolean started檢查觸發triggerMessageSending()去爲一個循環

現在MyClass的對象開始在onCreatetriggerMessageSending()方法,從而啓動兩個處理程序完成,然後可運行

注:onStop()可能會或可能在活動生命週期中不會被調用。檢查這個link。我的 意味着它不保證。做myClass.stopMessageSending();onPause()和檢查

所以你的消息被稱爲兩次。

+0

我想每隔500ms發送一次消息A和消息B.我如何在1個可運行的程序中執行此操作? – NewOne

+0

只需使用布爾變量並在發送消息後對其進行修改。如果(true)sendOne else sendSecond。變量應該是全局的,而不是處理程序的本地變量。同樣,如果調用處理程序,將檢查相同的全局變量併發送消息。 – Stallion