1

我在 Android 2.2 手机上遇到了一些奇怪的问题。

我打开套接字连接:

socket = new Socket(serverAddr, SERVERPORT);
messageWriter = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), Charset.forName("UTF-8"))));
messageReader = new InputStreamReader(socket.getInputStream(), Charset.forName("UTF-8"));

在 AsyncTask doInBackground() 中开始阅读:

    protected Boolean doInBackground(final Void... unused) {
    ...
        char[] chars = new char[256];
        int len;
        while((len = messageReader.read(chars))>=0) {
               builder.append(chars, 0, len);
               break;
        }
       result = true;
    ...
    }

阅读后我关闭连接:

                try {
                    socket.close();
                    socket = null;
                } catch (Exception e) {Log.e("socket", "ex");}
                try {
                    messageWriter.close();
                    messageWriter = null;
                } catch (Exception e) {Log.e("writer", "ex");}
                try {
                    messageReader.close();
                    messageReader = null;                   
                } catch (Exception e) {Log.e("reader", "ex");}  

在 Android 2.3 手机和 Android 4.0 模拟器上一切正常,但由于某种原因,它不适用于 Android 2.2 手机。套接字已关闭,编写器已关闭,但读取器卡在 while 循环中,即使在调用“socket.close();”时它应该制动循环......所以我的关闭代码卡在“messageReader.close( );" 整个用户界面都被阻止了!...并且没有办法杀死 AsyncTask ...为什么会发生这种情况,我该怎么办?

4

1 回答 1

1

首先,您不需要这三个关闭。您只需要关闭输出流/写入器。

其次,关闭不能保证终止另一个线程中的阻塞操作。请参阅 Javadoc。如果您有这样的事情,您需要在关闭之前关闭套接字以进行输入。然后读取线程将获得一个 EOS,它应该退出。

于 2013-12-15T22:23:35.070 回答