1

ソケットを介してサーバーに文字列を送信し、サーバーがそのデータを処理した後に出力を読み取るアプリを作成しています。フォアグラウンド タスクのときは完全に機能しましたが、ソケット通信がバックグラウンドで実行されている間に AsyncTask を使用してプロセス ダイアログを表示し、サーバーからの出力を読み取ってからソケットを閉じようとすると、問題が発生し始めます。

private class Progressor extends AsyncTask<String, Void, Void> {
        ProgressDialog dialog;

        protected void onPreExecute() {
            dialog = ProgressDialog.show(ClearTalkInputActivity.this, "Loading..", "Analyzing Text", true, false);
        }

        protected Void doInBackground(String... strings) {
            String language = strings[0].toLowerCase();
            String the_text = strings[1];
            Socket socket = null; 
            DataOutputStream dos = null;
            DataInputStream dis = null;

            try {
                socket = new Socket(my_ip, port);
                dos = new DataOutputStream(socket.getOutputStream());
                dis = new DataInputStream(socket.getInputStream());
                dos.writeUTF(language+"****"+the_text);
                String in = "";
                while (in.indexOf("</content>") < 0) {
                    in += dis.readUTF();    
                }
                socket.close();

                save_str(OUTPUT_KEY, in);   


                } catch (UnknownHostException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
            } 
            finally {
                if (socket != null) {
                    try {
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }

            if (dos != null) {
                try {
                    dos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (dis != null) {
                try {
                    dis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } 

            return null;
        }


    protected void onPostExecute() {
        if (dialog.isShowing())
            dialog.dismiss();
        startActivity(new Intent (output_intent));
    }
} 
4

1 に答える 1

0

Android で推奨される方法は、含まれている 2 つの HttpClients のいずれかを使用することです。

アパッチ HTTP クライアント

HttpURL接続

ソケットを直接使用する必要はありません。これらのクライアントは、エクスペリエンスを向上させるために多くのことを行います。

これは Android 開発者によるブログ記事で、基本を説明しています: http://android-developers.blogspot.de/2011/09/androids-http-clients.html

于 2012-06-22T15:04:13.493 に答える