9

イベントをサーバー送信イベントとしてクライアントに送信するバックエンド サーバーがあります。Android でこのテクノロジを処理するための適切なライブラリを見つけることができなかったため、(イベント エンドポイントへの GET を介して) サーバーで新しいイベントを定期的にチェックするフォールバック メソッドを使用しています。

これは、バックグラウンド サービスによって 10 秒ごとに行われます。言うまでもなく、これは最善の方法ではありません。このシナリオで利用できるオープン ソース ライブラリがまだない場合、サーバー バックエンドで新しいイベントを定期的にチェックするには、メモリ使用量とバッテリー消費量の点でどのような方法が最適ですか? Android で開いているソケットを管理するよりも、API エンドポイントに GET を実行する方が良いですか、悪いですか?

私はどんな提案にもオープンです。ありがとう。

4

1 に答える 1

3

を使用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();
}
于 2015-07-05T22:31:24.313 に答える