Android-асинхронное чтение из сокета - PullRequest
1 голос
/ 17 февраля 2012

У меня проблемы с чтением / записью на tcp сервер, для которого я собираю приложение. В недавней ветке мне предложили использовать службу вместо этого, но это проект для школы, в котором предлагался asyncTask, так что я мог бы также пойти на это.

Итак, классы, которые я получил, - это мой класс активности и асинхронный, в активности ничего интересного не происходит, кроме отправки строки, которая работает так плохо, что с асинхронным не получается.

    class ServerTask extends AsyncTask<Void, Void, Void>{

        public static String ip = "10.0.2.2";
        public static int port = 2002;
        Socket socket;
        public DataInputStream dis;
        public DataOutputStream dos;
        public String message;

        @Override
        protected Void doInBackground(Void... params) {

            try {
                socket = new Socket(ip, port);
                dis = new DataInputStream(socket.getInputStream());
                dos = new DataOutputStream(socket.getOutputStream());

            } catch (Exception e) {
                Log.i("AsyncTank", "Cannot create Socket");
            }
            while(socket.isConnected()){
                read();                     
                    }
                }

            }
            return null;
        }

        public void write(String message) {
            try {
                if (socket.isConnected()){
                    dos.writeUTF(message);
                    dos.flush();
                } else {
                    Log.i("AsynkTask", "Socket appears to be closed");
                }
            } catch (Exception e) {
                Log.i("AsynkTask", "Writing failed");
            }
        }

        public String read() {
            try {
                if (socket.isConnected()) {
                    message = dis.readLine();
                } else {
                    Log.i("AsyncTask", "Cannot read");
                }
            } catch (Exception e) {
                Log.i("AsyncTask", "Cannot read from stream");
            }
            return message;
        }
    }

Вещи, которые я знаю, сервер получает сообщения, но не обновляет, пока я не перезапущу сервер, что заставляет меня поверить, что я не нажимаю новую строку или что-то, что заставляет все это выглядеть как одна строка после ее закрытия. Тем не менее, это может быть и сервер, за который я не отвечаю, так что плохо читать в этом.

Однако часть чтения не хочет работать, я не уверен, как вызвать метод, чтобы он постоянно слушал и реагировал на серверы sockt? Я пытался создать поток непосредственно перед возвратом в doInBackGround, но затем приложение запускается работает в течение нескольких секунд, сила закрывается из-за нехватки памяти? Нужна ли мне тема, чтобы постоянно слушать?

Весь смысл этого, как вы можете догадаться, состоит в том, чтобы создать чат, чтобы метод read в конечном итоге должен был обновить textView в моем классе активности. Метод send «работает», но не так, как должен, хотя это может быть, как я уже говорил ранее, сервер делает что-то напуганное.

Еще один, возможно ли вообще иметь чтение как метод, как у меня, или что-то должно реагировать, когда сервер отправляет данные и затем вызывает метод?

Редактировать Теперь я переместил часть чтения или, по крайней мере, часть из нее в doInBackGround, так что теперь она

    dis = new BufferedReader(new InputStreamReader(socket.getInputStream()));

    message = dis.readLine();
    Log.i("AsynkTask", "Read : "+message+" this is doInBackGround!");

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

Как это выглядит? Это полная чушь этот код и должно быть сделано как-то иначе? Получил мою функциональность, но никогда не плохо учиться, чтобы сделать это лучше, так сказать:).

1 Ответ

0 голосов
/ 17 февраля 2012

Вы должны выполнять как запись, так и чтение в Socket с помощью метода doInBackground () AsyncTask, так как оба требуют времени и могут блокировать основной поток (UI). Я не знаю, как вы вызываете свой метод write () выше, но вы также можете взглянуть на этот вопрос, который может быть связан .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...