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

Ну, я знаком с программированием сокетов в среде c, iOS ... Но теперь пытаюсь подключиться мой андроид и мой удаленный сервер через сокеты ... Для начала я написал простую серверную программу на C и запустил ее на своем рабочем столе, которая терпеливо ожидает запроса на соединение, принимает соединение, затем ждет некоторой строки запроса и получение строки запроса возвращает некоторую строку ответа, затем снова ждите следующего запроса и продолжайте .. Ну, вы поняли идею ..

Пока

  1. я установил соединение с моим android и сервером
  2. отправил и полученные данные

А это мой клиентский код ..

public class SocketMaster {
    private Socket clientSocket     =   null;
        BufferedReader socketReadStream =   null;
    public boolean connectToHost(String ip, int port){
        try {
            InetAddress serverAddr  =   InetAddress.getByName(ip);
            try {
                clientSocket        =   new Socket(serverAddr, port);
                socketReadStream    =   new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                String line     =   null;
                String stringToSend =   "This is from client ...Are you there???";

                //Write to server..stringToSend is the request string..
                this.writeToServer(stringToSend);

                //Now read the response..
                while((line = socketReadStream.readLine()) != null){
                    Log.d("Message", line);
                }
            } catch (IOException e) {
                e.printStackTrace();
                return false;
            }
        } catch (UnknownHostException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    public boolean writeToServer(String stringToSend){
        DataOutputStream dos        =   null;
        try {
            dos                         =   new DataOutputStream(clientSocket.getOutputStream());
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
        try {
            dos.write(stringToSend.getBytes());
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
}

Я создаю объект SocketMaster из другого действия и вызываю connectTo Хост передает IP-адрес и порт сервера. Все работает нормально, и я могу подключаться, отправлять и получать данные ..

Теперь мой вопрос касается этих строк

//Now read the response..
while((line = socketReadStream.readLine()) != null){
     Log.d("Message", line);
}

Насколько я понимаю, поток, выполняющий этот код

  • блокируется до тех пор, пока не появятся данные для чтения
  • , если данные доступны, прочтите их, затем из-за цикла снова блоки, пока прибывает следующий кусок данных

Просто я не могу запустить этот код в основном потоке, так как он заблокирует мои действия пользовательского интерфейса ... Я могу подумать о запуске этого в фоновом потоке, что является одним из вариантов ...

Но В идеале я хочу ...

Обратный вызов (я думаю, слушатель в терминах Android, любой, кто знаком с iOS CFSocket и обратным вызовом ), метод , который вызывается, когда есть данные, доступные для чтения, так что я могу просто прочитать данные, а затем вернуться ..

Есть ли такой механизм в android / java ... Если нет (:-(), может ли кто-нибудь связать я приведу пример, в котором обработка сокетов выполняется в фоновом режиме ...

РЕДАКТИРОВАТЬ: Я не спрашивал сам о создании механизма обратного вызова ..Я просто спрашивал, присутствует ли какой-либо слушатель, который уведомляет вас, когда есть данные для чтения, когда соединение было отключено ... Таким образом, я могу устранить приведенный выше цикл while ... Если нет обратного вызова, я готов двигаться этот сокет в другой поток, который перебирает и считывает данные (что фактически я уже сделал) ...

**

EDIT Bounty time again ..

**

Ну, я 2 слаб старый разработчик android / java с хорошими 3,5 годами опыта разработки c / c ++ / objective c за этим ... Итак, я видел собственные сокеты низкого уровня c (которые блокируют (настраиваются) при использовании read () и recv ()) и CFSocket от Apple (который сам является сокетом C, но предоставляет оболочку для обеспечения механизма обратного вызова). Я не спрашиваю о кодировании механизма обратного вызова здесь (что я искренне готов сделать, если нет готовых альтернатива присутствует, но зачем снова изобретать велосипед?) ... Я начинаю понимать java как очень продвинутую платформу высокого уровня .. Я подумал, что Там должна быть какая-то библиотека-оболочка более высокого уровня, которая таится вокруг ... Так что я думаю об увеличении аудитории этого потока, начав вознаграждение ..

14
задан Krishnabhadra 4 August 2011 в 05:09
поделиться