0

事前定義されたInetAddressを介してソケット接続を受け入れるために非同期タスクを呼び出すアクティビティがあります。

非同期タスクは別の非同期タスクを呼び出してメッセージをリッスンしますが、getinputストリームでハングします

私は何時間も頭を悩ませてきましたが、なぜそれがぶら下がっているのか理解できません...助けてください。

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スレッドで作成する必要があります。

これを処理するには、成功した後、最初Threadのので新しいを呼び出します。onPostExecute()AsyncTaskaccept()onPostExecute()UI

while loopまた、これ以上見ずに、リクエストを受け付けてから最初のタスクから抜け出したいと思います。次に、別の接続を確立する必要がある場合は、このタスクの新しいインスタンスを自分UIとその中に作成しますexecute。私はそれを長く見ずにその最後の部分について前向きではありませんが、それは正しいようです

于 2013-03-21T20:31:43.487 に答える
0

よくわかりませんが、UIスレッドからのみAsyncTask.execute()を呼び出すことができ、別のスレッドで実行されるdoInBackground()から呼び出すことができます。

于 2013-03-21T20:10:57.073 に答える