2013-09-19 4 views
6

У меня есть серверный сервер, который отправляет события клиентам как Server Sent Events. Я не смог найти хорошую библиотеку для обработки этой технологии на Android, поэтому я использовал резервный метод периодической проверки сервера (через GET для конечной точки событий) для новых событий.Сервер отправил события в Android

Это делается службой фона каждые 10 секунд. Излишне говорить, что это не лучший подход. Если в этом сценарии нет доступных библиотек с открытым исходным кодом, какой наилучший подход к использованию памяти и потреблению батареи необходимо периодически проверять на сервере для новых событий? Является ли GET для конечной точки API лучше или хуже, чем управление открытым сокетом в Android?

Я открыт для любых предложений. Благодарю.

+0

Что вы искали, что GCM не ускользнул от вас? http://developer.android.com/google/gcm/index.html – 323go

+1

Я предложил использовать это, но так как уже существующий серверный сервер в производстве посылает серверные события нескольким клиентам (ios и веб-клиентам), включая специальное решение просто для устройств Android (к сожалению) не вариант. – Henrique

+0

Что такое "Серверные события"? Вы имеете в виду серверные события? http://en.wikipedia.org/wiki/Server-sent_events – CommonsWare

ответ

1

Вы можете просто использовать HttpUrlConnection, чтобы установить постоянное соединение с сервером (Android использует keep-alive по умолчанию) и обрабатывает полученные сообщения как потоки.

public class HttpRequest extends AsyncTask { 
    @Override 
    protected Object doInBackground(Object[] params){ 
     try { 
      URL url = new URL("http://simpl.info/eventsource/index.php"); 
      HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
      Log.d("SSE", "http response: " + urlConnection.getResponseCode()); 

      //Object inputStream = urlConnection.getContent(); 
      InputStream inputStream = new BufferedInputStream(urlConnection.getInputStream()); 
      Log.d("SSE reading stream", readStrem(inputStream)+""); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      Log.e("SSE activity", "Error on url openConnection: "+e.getMessage()); 
      e.printStackTrace(); 
     } 

     return null; 
    } 
} 

private String readStrem(InputStream inputStream) { 
    BufferedReader reader = null; 
    StringBuffer response = new StringBuffer(); 
    try{ 
     reader = new BufferedReader(new InputStreamReader(inputStream)); 
     String line = ""; 
     while((line = reader.readLine()) != null){ 
      Log.d("ServerSentEvents", "SSE event: "+line); 
     } 
    }catch (IOException e){ 
     e.printStackTrace(); 
    }finally { 
     if(reader != null){ 
      try{ 
       reader.close(); 
      }catch (IOException e){ 
       e.printStackTrace(); 
      } 
     } 
    } 
    return response.toString(); 
} 
Смежные вопросы