0

プッシュ通知に GCM を使用している Android アプリケーションを開発しています。MainActivity以下の方法でデバイスを登録しようとしていますonCreate()

        String regId = GCMRegistrar.getRegistrationId(this);
        if (regId.equals("")) 
        {
        GCMRegistrar.register(this, "My sender id");        
        }
        else
        {
            GCMIntentService.received=true;

        }

        while(!GCMIntentService.received)
        {
            Log.i("RegisterLocation","waiting...... for registartion id");

        }

で登録 ID を取得できませんが、デバイスが登録されると、 のサブクラスである クラスでMainActivity制御がOnRegistered(context,String)機能します。ログにも登録IDを出力できます。GCMIntentServiceGCMBaseIntentService

@Override
protected void onRegistered(Context context, String registrationId) 
{
    received=true;
    Log.i(TAG, "Device registered: regId = " + registrationId);
}

GCM はデバイスの登録に時間がかかるため、デバイスが登録されているかどうかをテストする while ループを記述しました。しかし、そのループは無限ループです。私も試しThread.sleep()ました。その登録IDをローカルサーバーに保存したい。
私の登録IDを取得するための解決策を提案できますMainActivityか?

4

2 に答える 2

0

また、登録IDをサーバーに保存するためのすべてのロジックをonRegistered、メインのアクティビティではなくメソッドで実行することをお勧めします。

ループが機能しない理由は、Java メモリ モデルに関係しています。

Thread.sleep も Thread.yield も同期セマンティクスを持たないことに注意することが重要です。特に、コンパイラは、Thread.sleep または Thread.yield を呼び出す前に、レジスタにキャッシュされた書き込みを共有メモリにフラッシュする必要はなく、Thread.sleep または Thread を呼び出した後に、レジスタにキャッシュされた値を再ロードする必要もありません。 。収率。

たとえば、次の (壊れた) コード フラグメントでは、 this.done が非揮発性ブール フィールドであると想定しています。

 while (!this.done)
     Thread.sleep(1000);

コンパイラは、フィールド this.done を 1 回だけ自由に読み取り、ループの各実行でキャッシュされた値を再利用できます。これは 、別のスレッドが this.done の値を変更したとしても、ループが終了しないことを意味します。

この例のthis.doneフィールドは、GCMIntentService.received. 揮発性にすると、動作するはずです。とはいえ、メイン アクティビティでそのループを使用することはお勧めしません。

于 2013-05-12T13:44:18.600 に答える
0

クラスですべての操作を行うことをお勧めしますService

で登録 ID を受信したら、サービスを呼び出しGCMIntentServiceます。

私は同じようにやったし、それはスムーズに動作します..

ハッピーコーディング:)

于 2013-05-12T12:49:32.287 に答える