退出活动时终止线程(android)

时间:2014-10-30 09:21:15

标签: java android multithreading

我在Android上的辅助活动中创建了一个线程,如下所示:

new Thread(new Runnable() {
                public void run() {
                    try {
                        String branch=spinner.getSelectedItem().toString();

                        while( branch.equals(spinner.getSelectedItem().toString())){
                            System.out.println("----LOOPER."+spinner.getSelectedItem().toString());
                            GetQinfo a= (GetQinfo) new GetQinfo().execute(city,type,org,spinner.getSelectedItem().toString());
                            Thread.sleep(refreshRate);                              
                        }
                    } catch (InterruptedException e){
                        e.printStackTrace();
                    } 
                 return;
                }
              }).start();
问题是,当我回到主要活动时,这个线程仍然在运行。 我做的是在goback按钮上写这个:

spinner.setSelection(0);
this.finish();

这样微调器的值就会改变,导致线程上的while循环返回false,从而退出线程。 但我不认为这是正确的做法。任何人都可以建议一些不同的,或者我应该说,更好的

3 个答案:

答案 0 :(得分:1)

离开活动时应该使用线程的interrupt()方法。

YourThread.interrupt();

new Thread(new Runnable() {
                public void run() {
                    try {
if(!Thread.interrupted())
                        String branch=spinner.getSelectedItem().toString();

                        while( branch.equals(spinner.getSelectedItem().toString())){
                            System.out.println("----LOOPER."+spinner.getSelectedItem().toString());
                            GetQinfo a= (GetQinfo) new GetQinfo().execute(city,type,org,spinner.getSelectedItem().toString());
                            Thread.sleep(refreshRate);                              
                        }
                    } catch (InterruptedException e){
                        e.printStackTrace();
                    } 
                 return;
                }
              }).start();

答案 1 :(得分:0)

没有明确可用于停止线程的方法。之前有一些方法可以阻止线程但是它们已被弃用。请阅读以下链接,了解java开发人员为何需要这样:http://docs.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html

根据这份文件,他们希望您按照建议的方式进行。所以你没错。

答案 2 :(得分:0)

 private volatile boolean stopThread;

   public void run() {
      String branch=spinner.getSelectedItem().toString();
      while (!stopThread) {
        System.out.println("----LOOPER."+spinner.getSelectedItem().toString());
        GetQinfo a= (GetQinfo) new GetQinfo().execute(city,type,org,spinner.getSelectedItem().toString());
        Thread.sleep(refreshRate); 
      }
   }


public void stopThread() {
    stopThread = true;
    thread.interrupt();
}