android杀死动作栏事件的特定线程

时间:2012-11-09 15:43:45

标签: android multithreading actionbarsherlock

我想杀死一个特定的线程,但无法想出让它工作的方法。 我接下来包括所有信息,即使它看起来不重要:

我使用操作栏sherlock并想要在动作按钮事件中杀死一个线程。所以,我有:

    Thread myThread;
    myThread = new Thread(new Runnable(){
        public void run(){
                functionX();
        }
      });
    myThread.start();

这个线程是一个长时间运行的线程,funcionX()也创建了一些新线程。 我希望在以下情况下杀死该线程:

   public boolean onOptionsItemSelected(MenuItem item){
    switch (item.getItemId()) {

    case android.R.id.home:
        myThread.interrupt();
        break;
    };

我尝试使用ExecutorService,使用submit(runnable)获取Future结果和Future.cancel,但似乎不起作用。 我还要提一下,functionX()使用http get请求从JSON服务获取数据。

3 个答案:

答案 0 :(得分:5)

有多种方法可以做到这一点,其中几种可能就像

  1. 而不是Thread使用TimerTask并调用timeTask.cancel() - 用于中断
  2. 在线程的run()方法中,继续检查一个布尔值以确定是否应该终止该线程,然后你可以调用中断或者更好地抛出异常

答案 1 :(得分:0)

来自rock_win的选项2是要走的路,你可以在这里找到附带一些代码的原因:

http://docs.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html

答案 2 :(得分:0)

这个问题已经问了很多年了,但如果有人需要,那么您可以使用 thread.interrupt(); 毫无问题地使用您的线程对象。如果您不熟悉 Java 或 Java 中的线程,并且想要停止线程而不更改很多内容或切换到不同的技术(例如 timertask),那么这没有任何问题,并且非常有用。

以防万一您需要再次启动线程,您需要重新初始化 Thread 对象来执行此操作。因此,为了做到这一点,我只是创建了一个实现 Runnable 的类,这样当我需要重新初始化线程对象时,我就不必输入太多内容。然后,每当我需要启动线程时,我都会调用

mythread = new Thread(new MyRunnable());  // initialize the thread
mythread.start();   // run the thread

然后当我需要停止它时:

mythread.interrupt();  //stop the thread

当我需要再次启动线程时,我不得不再次这样做:

mythread = new Thread(new MyRunnable());  //re-initialize the thread
mythread.start();   // start the new thread