如何正确中断android中的线程

时间:2014-07-09 12:44:55

标签: java android multithreading

在我的应用程序中,我有一个按钮,当它被点击时,我开始一个新的线程并更改按钮的文本。如果我再次按下按钮,它将开始更快地更改文本。

我想在第二次按下按钮时中断线程。有什么正确的方法吗?

public class TestActivity extends Activity {

 Button btn;
 int i = 0;

 @Override
 public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.main);
     btn = (Button)findViewById(R.id.btn);
     btn.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View v) {
           runThread();
       }
     });
 }

private void runThread() {
    new Thread() {
      public void run() {
          while (i++ < 1000) {
              try {
                  runOnUiThread(new Runnable() {

                      @Override
                      public void run() {
                          btn.setText("#" + i);
                      }
                  });
                  Thread.sleep(300);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
          }
      }
    }.start();
}

6 个答案:

答案 0 :(得分:3)

在这种情况下,只需保留对线程的引用并使用Thread.interrupt():

private Thread runThread() {

return new Thread() {
  public void run() {
      while (i++ < 1000) {
          try {
              runOnUiThread(new Runnable() {

                  @Override
                  public void run() {
                      btn.setText("#" + i);
                  }
              });
              Thread.sleep(300);
          } catch (InterruptedException e) {
              e.printStackTrace();
          }
      }
  }
}

然后:

 btn.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
       if (myThread != null) myThread.interrupt();
       myThread = runThread();
       myThread.start();
   }
 });

阅读这篇文章了解更多信息和选项:

How to properly stop the Thread in Java?

答案 1 :(得分:2)

在我看来,最好的方法是使用变量来控制它。

类似的东西:

while(i++ < 1000 && keepRunning)

我认为这是一个很好的解决方案,因为它无法导致意外行为,因为您确定线程将退出的确切时刻。

额外 -

作为建议,我还建议你设置你的线程非Damon(setDaemon(false)),因为它会进行布局更改

同样最好给线程命名(setName())以便于调试。

答案 2 :(得分:1)

现在每次按下按钮都会启动一个新的线程。

这样的事情应该有效。

public class TestActivity extends Activity {

Button btn;
int i = 0;
Thread countThread = null;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
countThread = new Thread() {
    public void run() {
      while (i++ < 1000) {
          try {
              runOnUiThread(new Runnable() {

                  @Override
                  public void run() {
                      btn.setText("#" + i);
                  }
              });
              Thread.sleep(300);
          } catch (InterruptedException e) {
              e.printStackTrace();
          }
      }
 }
 btn = (Button)findViewById(R.id.btn);
 btn.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
       runThread();
   }
 });
}

private void runThread() {
  if(countThread != null) {
    if(countThread.isAlive()) {
        countThread.stop();
    } else {
        countThread.start();
    }
  }
}

我只有一个文本编辑器,所以我无法保证这是否能解决您的问题。

答案 3 :(得分:1)

您可以使用thread.interrupt()interrupt主题。

答案 4 :(得分:0)

试试这个,只需要另外一个变量j,它将处理你的代码: -

public class TestActivity extends Activity {

     Button btn;
     int i = 0,j=0;

     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);
         btn = (Button)findViewById(R.id.btn);
         btn.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
                j=1;
               runThread();
           }
         });
     }

    private void runThread() {
        new Thread() {
          public void run() {
              while (i++ < 1000) {
                  try {
                      runOnUiThread(new Runnable() {

                          @Override
                          public void run() {
                              if(j==1){
                              btn.setText("#" + i);
                               j=0;
                               }
                                else
                                    Thread.interrupted();
                          }
                      });
                      Thread.sleep(300);
                  } catch (InterruptedException e) {
                      e.printStackTrace();
                  }
              }
          }
        }.start();
    }

答案 5 :(得分:0)

您可以在Android中使用普通Thread(并为您的用例调用interrupt()),但框架通过提供围绕线程的帮助程序类提供了其他更好的选项。您可以参考官方documentation页面了解其他选项。

HandlerThread是首选方案。如果您选择HandlerThread

,可以针对您的使用案例致电quitSafely()quit()

相关文章:

Why use HandlerThread in Android