Функционирование чтения сокетов больше не работает при вызове в AsyncTask

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));
    }
} 
  • 0
    Установка точек останова, если у вас есть несколько потоков, немного отличается. Вы удостоверились, что у вас открыт правильный поток при отладке? Вы действительно должны быть в состоянии увидеть, что происходит по линии. Посмотрите в верхнем левом углу, чтобы увидеть, какие темы у вас есть и их статус.
  • 0
    Проверено еще раз, и да. Оказывается, проблема происходит в socket.close ().
Теги:
sockets
android-asynctask

1 ответ

0

Рекомендуемым способом в Android является использование одного из двух включенных HttpClients:

HTTP-клиент Apache

HttpURLConnection

Нет необходимости напрямую использовать сокеты. Эти клиенты многое делают для улучшения вашего опыта.

Вот статья блога разработчиков Android, в которой объясняются основы: http://android-developers.blogspot.de/2011/09/androids-http-clients.html

  • 0
    Благодарю. Хотя почему при вызове socket.close () возникает ошибка?
  • 0
    Просто предположение, но вы уверены, что сокет! = Ноль?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню