2013-04-24 32 views
6

Tôi phải bắt đầu chạy trên nút bấm bắt đầu và dừng nó khi bấm nút tạm dừng. Mã của tôi cho sự khởi đầu Runnable vào nút bắt đầu nhấp chuột làLàm thế nào để dừng Runnable trên nút bấm trong Android?

// TODO Auto-generated method stub 
    //while (running) { 
    mUpdateTime = new Runnable() { 
      public void run() { 
    sec += 1; 
     if(sec >= 60) { 
      sec = 0; 
      min += 1; 
      if (min >= 60) { 
       min = 0; 
       hour += 1; 
      } 
     } 
     Min_txtvw.setText(String.format(mTimeFormat, hour, min, sec)); 
     mHandler.postDelayed(mUpdateTime, 1000); 
      } 
     }; 
     mHandler.postDelayed(mUpdateTime, 1000); 
    //} 

bây giờ tôi muốn dừng lại Runnable vào nút tạm dừng nhấp

pause_btn.setOnClickListener (new OnClickListener() {

 @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      play_btn.setVisibility(View.VISIBLE); 
      pause_btn.setVisibility(View.INVISIBLE); 

     } 
    }); 

thế nào tôi có thể dừng lại rằng runnable trên nút tạm dừng nhấp chuột nếu có ai biết xin vui lòng giúp tôi.

+1

có thể trùng lặp của [Android: Làm thế nào để ngăn chặn Runnable] (http://stackoverflow.com/questions/9458097/android-how-do-i-stop-runnable) –

Trả lời

12

Sử dụng

mHandler.removeCallbacksAndMessages(runnable); 

trong nút tạm dừng nhấp chuột.

+7

Điều này sẽ không ngừng hoạt động liên tục. – Gusdor

7

Giữ cờ boolean cancelled để lưu trữ trạng thái. itialize nó để sai và sau đó sửa đổi nó thành sự thật trên nhấp vào nút dừng.

Và bên trong phương thức run() của bạn, hãy tiếp tục kiểm tra cờ này.

Sửa

Trên phương pháp làm việc thường nhưng vẫn không phải là cách thích hợp nhất để ngăn chặn một Runnable/thread. Có thể có một tình huống mà công việc bị chặn và không thể kiểm tra cờ như hình dưới đây:

 public void run(){ 
     while(!cancelled){ 
      //blocking api call 
     } 
    } 

Giả nhiệm vụ được thực hiện cuộc gọi api chặn và cờ sau đó hủy được sửa đổi. Tác vụ sẽ không thể kiểm tra thay đổi trạng thái miễn là chặn cuộc gọi API đang diễn ra.

Alternative và cách tiếp cận Safe

cách đáng tin cậy nhất để ngăn chặn một chủ đề hoặc công việc (Runnable) là sử dụng ngắt cơ chế. Ngắt là một cơ chế hợp tác để đảm bảo rằng dừng thread không để nó ở trạng thái không nhất quán.
Trên blog của tôi, tôi đã thảo luận chi tiết về gián đoạn, link.

+1

AFAIK, đây là phương pháp tốt nhất để tắt hoạt động không đồng bộ. Nó không phải là miễn phí (các hoạt động có để thăm dò ý kiến ​​cờ), nhưng nó cho phép các hoạt động để kết thúc a) trong thời gian riêng của mình và b) làm sạch tất cả các nguồn lực của nó. Phương pháp tôi thấy quá thường xuyên chỉ là hủy bỏ một sợi - một thực hành rất nguy hiểm. Bằng mọi cách, hãy kế thừa Runnable của riêng bạn và tuyên bố cờ này để sử dụng lại! – Gusdor

+0

Không có vấn đề gì nếu bạn không chia sẻ gì (không có kiểu gốc, đối tượng, v.v.) giữa các chuỗi và dọn dẹp khi bạn dừng. – stephen

-2

Chỉ tạo chủ đề;
// bên trong nút bắt đầu

thread=new Thread(new Runnable() { 

    @Override 
    public void run() { 
    sec += 1; 
     if(sec >= 60) { 
      sec = 0; 
      min += 1; 
      if (min >= 60) { 
       min = 0; 
       hour += 1; 
     } 
     } 
     Min_txtvw.setText(String.format(mTimeFormat, hour, min, sec)); 
     mHandler.postDelayed(mUpdateTime, 1000); 
     }); 
    thread.start(); 

// bên stop nút

mHandler.removeCallbacksAndMessages(runnable); 
thread.stop(); 
+1

Điều gì có thể là mục đích của việc sử dụng Runnable bên trong một Chủ đề trong ví dụ của bạn ngoài việc trả lời câu hỏi? –

0

Sử dụng mã dưới đây:

handler.removeCallbacks(runnable); 
Các vấn đề liên quan