2012-02-26 38 views
24

tôi đã cố gắng theo cách này:Android: Làm thế nào để dừng Runnable?

private Runnable changeColor = new Runnable() { 
    private boolean killMe=false; 
    public void run() { 
     //some work 
     if(!killMe) color_changer.postDelayed(changeColor, 150); 
    } 
    public void kill(){ 
     killMe=true; 
    } 
}; 

nhưng tôi không thể truy cập kill() phương pháp!

Trả lời

37

Thay vào đó, hãy triển khai cơ chế thread.kill() của riêng bạn, sử dụng API hiện tại do SDK cung cấp. Quản lý tạo thread của bạn trong vòng một threadpool, và sử dụng Future.cancel() để diệt các sợi chạy:

ExecutorService threadPoolExecutor = Executors.newSingleThreadExecutor(); 
Runnable longRunningTask = new Runnable(); 

// submit task to threadpool: 
Future longRunningTaskFuture = threadPoolExecutor.submit(longRunningTask); 

... ... 
// At some point in the future, if you want to kill the task: 
longRunningTaskFuture.cancel(true); 
... ... 

Hủy bỏ phương pháp sẽ hành xử khác nhau dựa trên nhiệm vụ của bạn hoạt động nhà nước, kiểm tra các API để biết thêm chi tiết.

+0

Cảm ơn câu trả lời của bạn. Tôi sẽ không sử dụng thời gian này bởi vì tôi cần kiểm soát nhiều hơn API có thể cung cấp. Cảm ơn. –

+4

Điều này gây ra một lớp ngoại lệ cho tôi, Executors.newSingleThreadExecutor() không thể thuộc loại ThreadPoolExecutor Tôi tin rằng –

+0

Nếu 'longRunningTask' chứa một danh sách các nhiệm vụ, làm thế nào tôi có thể hủy bỏ thực hiện một số nhiệm vụ? Có thể có nhiều luồng chạy đồng thời. – Stallman

3

changeColor được khai báo là Runnable, không có phương thức kill().

Bạn cần tạo giao diện riêng mở rộng Runnable và thêm phương thức (công khai) kill().

+0

Nếu tôi tạo ra một lớp mới sau đó trình biên dịch nói rằng có vấn đề với "color_changer.postDelayed (changeColor, 150);" - changeColor không thể được giải quyết thành biến. –

+0

Không; Ý tôi là giao diện. Tuy nhiên, việc tạo một lớp không ẩn danh cũng sẽ hoạt động. Bạn có nghĩa là 'này'? – SLaks

+0

Vâng, ý tôi là, cảm ơn. –

14
public abstract class StoppableRunnable implements Runnable { 

    private volatile boolean mIsStopped = false; 

    public abstract void stoppableRun(); 

    public void run() { 
     setStopped(false); 
     while(!mIsStopped) { 
      stoppableRun(); 
      stop(); 
     } 
    } 

    public boolean isStopped() { 
     return mIsStopped; 
    } 

    private void setStopped(boolean isStop) {  
     if (mIsStopped != isStop) 
      mIsStopped = isStop; 
    } 

    public void stop() { 
     setStopped(true); 
    } 
} 

lớp ......

private Handler mHandler = new Handler(); 

public void onStopThread() { 
    mTask.stop();  
    mHandler.removeCallbacks(mTask); 
} 

public void onStartThread(long delayMillis) { 
    mHandler.postDelayed(mTask, delayMillis); 
} 

private StoppableRunnable mTask = new StoppableRunnable() { 
    public void stoppableRun() {   
        ..... 
      onStartThread(1000);     
     } 
    } 
}; 
+6

Bạn có nhận ra việc triển khai này để lại các chu trình CPU của bạn có thể Chạy được không? – stephen

8
mHandler.removeCallbacks(updateThread); 
+4

xin vui lòng, cố gắng mô tả câu trả lời – manetsus

+1

Đây là cách dễ nhất cho tôi. – bpiec

+1

Trên thực tế, điều này có vẻ là câu trả lời đúng, vì bạn không phải tạo Runnable tùy chỉnh của riêng bạn với tất cả yada-yada trong đó hoặc sử dụng ExecutorService. Đó là phương thức 'removeCallbacks' có sẵn cho. Đó là gần nhất với một 'clearTimeout' JavaScript, cùng một mẫu. –

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