本帖最后由 u011808175 于 2014-03-01 20:44:15 编辑

解决方案 »

  1.   

    阻塞的也没关系,当程序调用了onDestroy 时,设置一个标志位 hasStop= true;String ans = in.readLine();
    if (hasStop) {}
      

  2.   

    String ans = in.readLine();//这个地方应该会有超时异常
    if (hasStop) {
      //程序直接break;
      break;
    }
    Thread t = new Thread(runnable);
    t.stop();//执行这个方法,打断线程。
      

  3.   


    请详细说一下那个超时异常…………  程序不是在那一句就停住了么? 为什么还能执行到if(hasStop)那一句?
      

  4.   

    笨方法,你设置个判断,接收到byebye就关闭socket
      

  5.   

    问题是程序不会一直卡在String ans = in.readLine();这一句么?哪有机会去判断退出条件?
    class GetThread implements Runnable
        {
            boolean end;
            GetThread()
            {
                super();
                end=false;
            }
             
            @Override
            public void run() 
            {
                socket = the_app.socket;
                while(!end)
                {
                    if(end)
                        break;
                    try 
                    {
                        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                        String ans = in.readLine();//当启动这个线程的Activity退出的时候,线程会在这一句阻塞住,没有机会去判断退出条件
                        if(ans != null)
                        {
                            Message msg = new Message();
                            msg.obj = ans;
                            AskInputActivity.this.handler.sendMessage(msg);
                        }
                    } 
                    catch (IOException e) {
                        Message msg = new Message();
                        msg.obj = "net error";
                        AskInputActivity.this.handler.sendMessage(msg);
                        break;
                    }
                    catch (NullPointerException e)
                    {
                        Message msg = new Message();
                        msg.obj = "net error";
                        AskInputActivity.this.handler.sendMessage(msg);
                        break;
                    }
                     
                }
            }
             
            public void stop()
            {
                end = true;
            }
             
        }
      

  6.   

    socket.close.
    另外一个。你建立线程的对象的。close也可以。
      

  7.   


    这个socket是全局的,这个程序的所有activity都需要这个socket的连接,除了在退出的时候close,然后每个activity启动的时候连一下之外有什么更好的解决方法么?主要是如果这个线程不停止,在别的activity里面请求服务器发送消息的时候,这个线程就会得到另一个activity所请求的信息然后报错,另一个activity就收不到该收到的信息了,所以想在退出activity的时候退出线程。听说线程可以用interrupt强制打断?
      

  8.   

    也许没有什么好的办法吧,最后干脆回避掉这问题,尽量不让APP一直等待服务器输入就好了。对于询问-回答类的线程,一个线程只完成一次询问-回答就结束,下一个询问再开新的;其他的话,其实觉得还是应该把网络通信线程放在service里比较科学……