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 フォンでは動作しません。ソケットは閉じられ、ライターは閉じられますが、「socket.close();」を呼び出すときにループを停止する必要があるにもかかわらず、リーダーは while ループでスタックします...したがって、私の終了コードは「messageReader.close( );" UI全体がブロックされています!...そして、AsyncTask を強制終了する方法はありません...なぜこれが起こっているのですか?どうすればよいですか?

4

1 に答える 1

1

まず、これら 3 つの終了は必要ありません。出力ストリーム/ライターを閉じるだけで済みます。

第 2 に、クローズしても、別のスレッドでのブロック操作が終了するとは限りません。Javadoc を参照してください。そのような場合は、閉じる前に入力用のソケットをシャットダウンする必要があります。次に、読み取りスレッドは EOS を取得し、そこで終了する必要があります。

于 2013-12-15T22:23:35.070 に答える