0

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

Async 任务调用另一个 Async 任务来监听消息。但它挂在 get 输入流上

我已经绞尽脑汁好几个小时了,无法弄清楚它为什么会挂起……请帮忙。

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();
        }
    }
4

2 回答 2

1

根据文档

线程规则

要使此类正常工作,必须遵循一些线程规则:

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

您可以通过在您成功后在ThreadonPostExecute()的第一个中调用您的 new 来处理此问题,因为在AsyncTaskaccept()onPostExecute()UI

另外,不用多看它,我相信你会想while loop在它接受请求后的第一个任务中突破你的。然后,当您需要建立另一个连接时,您会在您的UIexecute它中再次创建此任务的新实例。如果不看更长时间,我对最后一部分并不乐观,但这似乎是正确的

于 2013-03-21T20:31:43.487 回答
0

我不确定,但我猜你只能从 UI 线程调用 AsyncTask.execute(),而你正试图从在单独线程中运行的 doInBackground() 中调用它。

于 2013-03-21T20:10:57.073 回答