2016-10-03 13 views
0

私のクラスには、一定の間隔でメッセージを送信するハンドラが2つあります。このクラスは、いずれかのアクティビティでインスタンス化されます。ここで複数回実行するハンドラ実行可能ファイル

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メソッドが2回呼び出されます。私がもう一度やるなら、これは3になります。アプリを終了せずにこのアクティビティを何度も呼び出すと、メソッドが呼び出されます。私は、アプリケーションを終了し、これをもう一度行う場合、初めて正常に動作します。

この理由は何ですか?どこが間違っていますか?

+0

私はよく分かりませんが、 'onStop()'メソッドで 'myClass = null;'を設定してみてください。 –

+0

試してみました – NewOne

+0

'static' myClassオブジェクトを試してみてください。 –

答えて

0

あなたのビジネスロジックについてはわかりませんが、これはあなたのコードでわかる問題です。

  • Runnableの両方が2つのランナブルを持つのポイントが何であるかを同じジョブ(sendMessageを)やっている場合は?
  • 第2のRunnable runnable2では、再び同じことが行われます。 onStop()よく、または可能性があります。唯一の違いは、triggerMessageSending()

今のMyClassオブジェクトの開始は2つのハンドラを開始triggerMessageSending()方法でonCreateで行われたループのために行くし、その後ランナブル

NOTEトリガーboolean startedのチェックがありますアクティビティライフサイクル中に呼び出されることはありません。これをチェックしてくださいlink。 I は保証されていないことを意味します。 myClass.stopMessageSending();onPause() にしていますし、あなたのメッセージが2回呼び出されそう

をご確認ください。

+0

メッセージAとメッセージBを500msごとに交互に送信したい。 1つの実行可能ファイルでこれをどのように行うことができますか? – NewOne

+0

ブール変数を使用してメッセージを送信した後に変更してください。 if(true)sendOne else sendSecond。変数はグローバルで、ハンドラにとってローカルではありません。ハンドラが呼び出されると、同じグローバル変数がチェックされ、メッセージが送信されます。 – Stallion

関連する問題