2013-03-21 585 views
0

我有一个Activity调用异步任务来通过预定义的InetAddress接受套接字连接。异步任务中的getInputStream任务

的异步任务调用另一个异步任务监听的消息。但它挂在获得输入流

我一直在货架我几个小时的大脑和想不通为什么它被挂...任何帮助请。

public void startSocketListener(InetAddress groupOwnerAddress) { 
    // TODO Auto-generated method stub 
    AcceptClientThread accept; 
    try { 
     accept = new AcceptClientThread(); 
     accept.execute(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 


} 

public class AcceptClientThread extends AsyncTask<Void, String, String>{ 

    public AcceptClientThread() throws IOException{ 

    } 

    @Override 
    protected void onCancelled() { 
     // TODO Auto-generated method stub 
     try { 
      serverSocket.close(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      Log.e("CONNECTION ERR", "Could not close serverSocket " + e.toString()); 
     } 
     super.onCancelled(); 
    } 

    @Override 
    protected String doInBackground(Void... params) { 

     try { 
      serverSocket = new ServerSocket(port); 
     } catch (IOException e) { 
      Log.e("CONNECTION ERR","Could not listen on port: " + port); 
      onCancelled(); 
     } 

     while (listening){ 
      try { 
       Log.i("CONNECTION", "AWAITING CONNECTION TO CLIENT"); 
       Socket newSocket = serverSocket.accept(); 
       Log.i("CONNECTION", "CONNECTED TO CLIENT"); 
       ListenerThread lThread = new ListenerThread(newSocket); 
       lThread.execute("Do it"); 
       Log.i("CONNECTION", "ACCEPTED CLIENT"); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       onProgressUpdate("could not accept client"); 
      } 

     } 
     Log.i("CONNECTION", "close socket"); 
     try { 
      serverSocket.close(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     return "table connected"; 
    } 

    @Override 
    protected void onProgressUpdate(String... values) { 
     super.onProgressUpdate(values); 
     // received data is first element in the String 
     //Toast.makeText(KitchenActivity.this, values[0], Toast.LENGTH_SHORT).show(); 
    } 

} 

public class ListenerThread extends AsyncTask<String, Order, Void> { 

    private Socket socket; 
    ObjectInputStream ois; 

    public ListenerThread(Socket socket){ 
     this.socket = socket; 
     try { 
      ois = new ObjectInputStream(this.socket.getInputStream()); //hangs here 
     } catch (StreamCorruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
+1

“倾听”曾经“虚假”?现在看起来你有一个'无限循环',它一直试图创建一个新的'Socket',除非我失去了一些东西。 – codeMagic 2013-03-21 20:15:29

+0

当用户关闭活动或按下按钮时,listen的确会相等。这只是侦听传入的连接 – Intern87 2013-03-21 20:19:40

回答

1

根据The Docs

线程规则

有一些线程规则必须遵循 此类才能正常工作:

的的AsyncTask类必须加载在UI线程上。从JELLY_BEAN开始自动完成 。 UI线程必须在 上创建任务实例。

您可以通过调用的onPostExecute()Thread处理这是你第AsyncTaskaccept()是成功的,因为onPostExecute()UI

也运行后,不看它多了,我相信你在第一个任务接受请求后,会想要突破你的while loop。然后,当您需要建立另一个连接时,您可以在UIexecute中再次创建此任务的新实例。我对最后一部分没有正面评论,但没有再看它,但似乎是正确的

+0

运行在onPostExecute()帮助,谢谢! – Intern87 2013-03-22 02:01:13

+0

非常欢迎。很高兴我能帮上忙! – codeMagic 2013-03-22 09:56:05

0

我不知道,但我猜你只能从UI线程调用AsyncTask.execute(),和你想从doInBackground(),它运行在单独的线程中做到这一点。

+0

理想情况下,我希望能够有尽可能多的连接,我会把它放到一个数组中,并尝试它 – Intern87 2013-03-21 20:11:58

+1

AsyncTask是专为后台工作。以服务器的方式处理请求需要你实现一些更合适的东西,例如准备处理这些请求的工作线程池。你想看看ThreadPoolExecutor类。 – 2013-03-21 20:16:22