问题
I tried this way:
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;
   }
};
but I can\'t access kill() method!
回答1:
Instead implement your own thread.kill() mechanism, using existing API provided by the SDK. Manage your thread creation within a threadpool, and use Future.cancel() to kill the running thread:
ExecutorService executorService = Executors.newSingleThreadExecutor();
Runnable longRunningTask = new Runnable();
// submit task to threadpool:
Future longRunningTaskFuture = executorService.submit(longRunningTask);
... ...
// At some point in the future, if you want to kill the task:
longRunningTaskFuture.cancel(true);
... ...
Cancel method will behave differently based on your task running state, check the API for more details.
回答2:
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);
    }
}
class ......
    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);                
        }
    }
};
    回答3:
mHandler.removeCallbacks(updateThread);
    回答4:
changeColor is declared as Runnable, which does not have a kill() method.
You need to create your own interface that extends Runnable and adds a (public) kill() method.
回答5:
You can Use this way
Stop Runnable Thread //==============================================================================
 ThreadUtil.startTask(() -> {
                        // doTask
                    }, 1500);
//==============================================================================
 public class ThreadUtil {
        private static Handler handler;
        private static Runnable runnable;
        public static void startTask(IThreadTask iThreadTask, long delayTime) {
            stopTask();
            handler = new Handler();
            runnable = () -> {
                iThreadTask.doTask();
            };
            if (handler == null || runnable == null) {
                return;
            }
            handler.postDelayed(runnable, delayTime);
        }
        public static void stopTask() {
            try {
                handler.removeCallbacks(runnable);
                handler.removeCallbacksAndMessages(null);
                handler = null;
                runnable = null;
            }catch (Exception e){
                Log.e("ThreadUtil:","Error:"+e.toString());
            }
        }
        public interface IThreadTask {
            void doTask();
        }
    }
    来源:https://stackoverflow.com/questions/9458097/android-how-do-i-stop-runnable