Android线程问题

时间:2011-02-04 10:01:12

标签: android multithreading

我已经知道如何停止线程,但我现在的情况有所不同,我正在从线程中的服务器监听数据

while (connected) 
{
    byte[] buffer = new byte[1024];
    if(in.read(buffer) > 0)// waits on this line
    {
        //do something  
    }
 }

现在问题是虽然我设置了connected = false;然后它也没有停止,因为它等待in.read所以,我也尝试Thread.interrupt但没有运气

3 个答案:

答案 0 :(得分:1)

您应该切换到使用SelectableChannel方法来读取/写入使用非阻塞I / O的套接字,并且您可以通过侦听“事件”来管理多个连接。然后,您可以避免在read()等电话中被阻止。

不幸的是,这与你目前使用的模型有着根本不同的模式,因此转换不会快速或简单,但值得付出努力。

查看以下资源:

http://developer.android.com/reference/java/nio/channels/SocketChannel.html http://www.exampledepot.com/egs/java.nio/NbClientSocket.html

答案 1 :(得分:1)

我们需要更多信息:

  1. 您如何声明和修改connected
  2. 您是否有“吃”InterruptedException
  3. 的尝试
  4. 如何创建线程?
  5. 你是如何开始这个主题的?
  6. 你如何(试图)终止线程?
  7. 提供符合sscce标准的示例,我们可以将其复制并放大粘贴,编译并查看您的确切问题。
  8. 通常,您的代码应如下所示:

    while (connected) 
    {
        try
        {
            byte[] buffer = new byte[1024];
            if(in.read(buffer) > 0)// waits on this line
            {
                //do something  
            }
        }
        catch(InterruptedException ie)
        {
            // there are several ways which you can exit the loop:
    
            // 1. you can break
            // 2. set the connected flag to false
    
        }
    }
    

    确认您确实捕获了中断异常!如果你没有捕获它,那么构建一个小的sscce兼容的例子,你只复制特定的问题(应该很容易)。

答案 2 :(得分:0)

我按照以下方式修改了代码

while (connected) 
{
   byte[] buffer = new byte[1024];
   if(in.available()  > 0)// changed this line
   {
      in.read(buffer)
      //do something  
   }  
}

它对我来说很好,因为in.available()语句是非阻塞的我认为