2013-09-07 60 views
22

Tôi đang sử dụng trình xử lý trong chương trình sau và tôi muốn dừng nó khi i = 5 nhưng trình xử lý không dừng và chạy liên tục.Làm thế nào để dừng Handler Runnable?

b1.setOnClickListener(new OnClickListener() { 

     public void onClick(View v) { 
      handler = new Handler(); 
      runnable = new Runnable() { 
       public void run() { 

        try { 
         Toast.makeText(getApplicationContext(), "Handler is working", Toast.LENGTH_LONG).show(); 
         System.out.print("Handler is working"); 

         if(i==5){ 
          //Thread.currentThread().interrupt(); 
          handler.removeCallbacks(runnable); 


          System.out.print("ok"); 
             Toast.makeText(getApplicationContext(), "ok", Toast.LENGTH_LONG).show(); 
         } 
         i++; 
        } catch (Exception e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
        handler.postDelayed(this, 5000); 

       } 
      }; 
      handler.postDelayed(runnable, 5000); 
      //return; 
     } 
    }); 
+0

bạn đã có 'handler.removeCallbacks (runnable); 'http://developer.android.com/reference/android/os/Handler.html – Raghunandan

+0

bạn cũng có thể sử dụng đếm ngược hẹn giờ một xử lý hoặc một nhiệm vụ hẹn giờ – Raghunandan

+0

có thể trùng lặp của [hủy bỏ một quá trình handler.postdelayed] (http://stackoverflow.com/questions/4378533/cancelling-a-handler-postdelayed-process) – Varun

Trả lời

17
protected void onStop() { 
    super.onStop(); 
    handler.removeCallbacks(runnable); 
} 

bạn có thể dừng nó như thế này

29

Bởi vì bạn gọi postDelayed() lại sau khi gỡ bỏ lưng gọi. Vui lòng sử dụng mã này:

final Handler handler = new Handler(); 
final Runnable runnable = new Runnable() { 
     public void run() { 
       Log.d("Runnable","Handler is working"); 
       if(i == 5){ // just remove call backs 
        handler.removeCallbacks(this); 
        Log.d("Runnable","ok"); 
       } else { // post again 
        i++; 
        handler.postDelayed(this, 5000); 
       } 
     } 
    }; 

//now somewhere in a method 
b1.setOnClickListener(new OnClickListener() { 
    public void onClick(View v) { 
     handler.removeCallbacks(runnable); 
     handler.postDelayed(runnable, 5000); 
    } 
}); 
+0

bạn có thể vui lòng chỉ giải thích lý do tại sao bạn viết handler.postDelayed (runnable, 5000); hai lần –

+0

@AjitDubey Có thể chỉnh sửa mới nhất sẽ giúp bạn hiểu rõ hơn. –

+0

@ M-WaJeEh- Khi tôi hiểu bài đầu tiên PostDelayed (runnable, 5000) sẽ bắt đầu sau 5 Sec và một cái khác (đó là phương thức chạy bên trong) bắt đầu đếm khoảng thời gian 5 giây. tôi có đúng không –

0

Tôi đã tìm được giải pháp phù hợp với mình. Đây là một ví dụ về mã, nơi tôi mong đợi một bộ đếm thời gian dừng lại, nhưng tôi thấy nó còn sống, ngay cả khi tôi đã được ra khỏi hoạt động:

boolean bFlagForceExit = false; 
Handler timerHandler = new Handler(); 
private Runnable timerRunnable = new Runnable() { 
    @Override 
    public void run() { 

     if (bFlagForceExit) 
    MyProcessForExit(); 

     if (bSomeflagForRunAction) 
      RunProcess(); 

     timerHandler.postDelayed(this, MILISEGUNDOS_ESPERA);  } 
}; 


private void MyProcessForExit() 
{ 
    timerHandler.removeCallbacks(timerRunnable); 
// close activity or whatever 
finish(); 
} 


private void RunProcess() 
{ 
    // action that i do when tick 
// time to leave or stop 
bFlagForceExit = true; 
} 

Sau đó, tôi phát hiện ra rằng các công trình này nếu removeCallbacks(timerRunnable) được kêu gọi đề khác , vì vậy, tôi đã giải quyết được vấn đề như thế này.

boolean bFlagForceExit = false; 
Handler timerHandler = new Handler(); 
private Runnable timerRunnable = new Runnable() { 
    @Override 
    public void run() { 

     if (bFlagForceExit) 
     { 
    // add a thred for run your stop handler 
      new Thread(new Runnable() { 
       public void run() { 
        SalirDeProceso(); 
       } 
      }).start(); 
     } 

     if (bSomeflagForRunAction) 
      RUnProcess(); 

     timerHandler.postDelayed(this, MILISEGUNDOS_ESPERA);  } 
}; 
0

Bạn không hiển thị vị trí "i" được khởi tạo. Có thể nó không bao giờ là < 5.

Các vấn đề liên quan