10

大学の最終学年のプロジェクトで Google クラウド メッセージングを使用しています。すべて問題なく動作しますが、GCM で少し問題が発生しています。ほとんどの場合、メッセージはほぼ瞬時に配信されるか、大幅に遅れて配信されます。

私はこれを読みましたが、この場合には当てはまらないと思います:

GCM は通常、メッセージが送信されるとすぐに配信します。ただし、これが常に可能であるとは限りません。たとえば、デバイスの電源がオフになっている、オフラインになっている、またはその他の理由で使用できない可能性があります。他の場合では、送信側自体が、delay_while_idle フラグを使用して、デバイスがアクティブになるまでメッセージを配信しないように要求する場合があります。最後に、GCM は意図的にメッセージを遅らせて、アプリケーションが過剰なリソースを消費し、バッテリー寿命に悪影響を与えないようにする場合があります。

私のプロジェクトでは、サーバーから 1 分間にせいぜい 5 つか 6 つのメッセージについて話していました。GCM がチャット アプリケーションに使用できる場合、この速度で送受信されるメッセージをブロックできませんでした。私のプロジェクトが50%の時間しか機能しない場合、それはかなり面倒になり、かなりひどくなります...

サーバーが送信するメッセージのコードは次のとおりです。

@Override
public void run() {

    Message.Builder messageBuilder = new Message.Builder().delayWhileIdle(false);
    Gson gson = new Gson();
    messageBuilder.addData("profile", gson.toJson(profile));
    databaseConnection.notifyDevices(messageBuilder.build());

}

public void notifyDevices(Message message) {

        Sender sender = new Sender(xxx);

        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
        nameValuePairs.add(new BasicNameValuePair("message", message.toString()));

        //LOG
        System.out.println("Notifying devices with the following message \n \"" +message+ "\"");

        List<String> deviceIDsList = new ArrayList<String>();
        String [] deviceIDArray;

        //Get devices to notify
        List<JSONDeviceProfile> deviceList = getDevicesToNotify();

        for(JSONDeviceProfile device : deviceList) {
            deviceIDsList.add(device.getDeviceId());

            try {
                sender.send(message, device.getDeviceId(), 5);
            } catch (IOException e) {
                System.out.println("Error sending GCM message!");
                e.printStackTrace();
            }
        }
}

そして、私の Android onMessage メソッド:

@Override
protected void onMessage(Context arg0, Intent intent) {

    String message = intent.getStringExtra("profile");

    Log.d(TAG + "Received Message: ", "Received Message: " + message.toString());

    //CALL NEW INTENT WITH PROFILE DETAILS
    Intent displayProfileIntent = new Intent(arg0, DisplayProfile.class);
    displayProfileIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    displayProfileIntent.putExtra("message", message); 
    startActivity(displayProfileIntent);

    /*
    //generateNotification(arg0, username);

    handler.post(new Runnable() {
        @Override
        public void run() {
            //Toast.makeText(getApplicationContext(), username, Toast.LENGTH_SHORT).show();

        }
    });
    */
}

誰かが同様の問題を抱えていることを願っています。問題が私が行っていることなのか、それとも私の手の届かないところにあるのかを確認したいだけです。

tl;dr GCM メッセージは、すぐに到着するか、約 10 分後に到着します (通常、遅延は一貫しています)。

4

1 に答える 1