2011-09-09 126 views
1

奇怪的问题,似乎已经提到了几次在这里。我有一个线程,也使用了AsyncTask,并且我正试图根据用户的请求使其停止运行。 因此,自然,我在while循环中使用布尔值。该线程始终将布尔值视为true,即使在其他位置输出false也是如此。Android - 使用while循环停止线程

代码如下,任何帮助表示赞赏!

/** 
* Opens new socket and listens on the specified port until a user stops the thread, the logview is updated with messages 
*/ 
public void run() { 
    byte[] receiveData = new byte[1024]; 
    byte[] sendData = new byte[1024]; 
    Log.e("Text2Server", "Starting Server"); 
    this.running = true; 
    while(this.running) { 
     Log.i("Text2Server", "Server should be running: " + running); 
     try { 
      serverSocket = new DatagramSocket(port); 
     } catch (SocketException e1) { 
      e1.printStackTrace(); 
     } 
     try { 
      DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
      serverSocket.receive(receivePacket); 
      final String fromIP = new String(receivePacket.getAddress().toString()); 
      final int fromPort = receivePacket.getPort(); 
      final String received = new String(receivePacket.getData()); 
      Date now = new Date(); 
      final String logput = DateFormat.getDateTimeInstance().format(now) + " - Message from: " + fromIP + " through Port: " + fromPort + " with Message: " + received; 
      Log.i("Text2Server", logput); 
      //All UI Operations are done in this thread 
      uiHandler.post(new Runnable(){ 
       @Override 
       public void run() { 
        logTextView.append(logput); 
       }     
      }); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
    serverSocket.close(); 
} 

public void stopThread() { 
    this.running = false; 
    Log.i("Text2Server", "Stopping Server, value is now: " + running); 
} 

调用stopThread()使其成为false,但线程仍然进入while并打印出true。有什么想法吗?

谢谢!

+0

你是怎么给stopThread打电话的? – Rob

+0

从活动中,我创建线程的一个实例,将其设置为在该活动中运行,然后在用户按下按钮时调用stopThread() –

+0

在日志中显示“running”的值而不是“this.running” ... – BrainCrash

回答

1

可能的原因:

1)你已经催生了一个多线程的,只有已经关闭了其中的一个。

2)在线程开始运行之前调用stopThread

3)该线程在UI线程上排队了很多logTextView.append(logput)调用,因此出现以后仍然在运行。

+0

也许在while循环之后添加一个日志输出来仔细检查第三种可能性。 – Zharf

+0

谢谢,第三种可能性的日志输出仍然显示,尽管它似乎没有更新textview,但这是另一个问题。 只有一个线程由活动产生,停止线程仅在收到至少一条消息后才被调用。这是一个奇怪的。 –