3

すでにGCMに登録されているデバイスがあります。検索してみましたが、似たような問題は見つかりませんでした。ほとんどのユーザーは、getRegistrationIdが空でない文字列を返すのに問題があるようです。これがエラーを引き起こす理由についてのアイデアはありますか?

public class UploadOption extends Activity{
    Intent extras = getIntent();
    String optionid = extras.getStringExtra("KEY_OPTION");
    String duration = extras.getStringExtra("KEY_DURATION");
    String reward = extras.getStringExtra("KEY_REWARD");


    @Override
    public void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.debug_layout);

        final String regId = GCMRegistrar.getRegistrationId(this);
        TextView tvDebug = (TextView) findViewById(R.id.tvDebug);
        tvDebug.setText(regId);

        // Stores option id, php grabs option.
        //new Upload().execute();
    }
}

エラーログは以下のとおりです。

01-18 18:02:51.756: D/AndroidRuntime(4478): Shutting down VM
01-18 18:02:51.756: W/dalvikvm(4478): threadid=1: thread exiting with uncaught exception (group=0x4001e578)
01-18 18:02:51.803: E/AndroidRuntime(4478): FATAL EXCEPTION: main
01-18 18:02:51.803: E/AndroidRuntime(4478): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.matt.drapp/com.matt.drapp.UploadOption}: java.lang.NullPointerException
01-18 18:02:51.803: E/AndroidRuntime(4478):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1573)
01-18 18:02:51.803: E/AndroidRuntime(4478):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
01-18 18:02:51.803: E/AndroidRuntime(4478):     at android.app.ActivityThread.access$1500(ActivityThread.java:117)
01-18 18:02:51.803: E/AndroidRuntime(4478):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
01-18 18:02:51.803: E/AndroidRuntime(4478):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-18 18:02:51.803: E/AndroidRuntime(4478):     at android.os.Looper.loop(Looper.java:130)
01-18 18:02:51.803: E/AndroidRuntime(4478):     at android.app.ActivityThread.main(ActivityThread.java:3687)
01-18 18:02:51.803: E/AndroidRuntime(4478):     at java.lang.reflect.Method.invokeNative(Native Method)
01-18 18:02:51.803: E/AndroidRuntime(4478):     at java.lang.reflect.Method.invoke(Method.java:507)
01-18 18:02:51.803: E/AndroidRuntime(4478):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
01-18 18:02:51.803: E/AndroidRuntime(4478):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
01-18 18:02:51.803: E/AndroidRuntime(4478):     at dalvik.system.NativeStart.main(Native Method)
01-18 18:02:51.803: E/AndroidRuntime(4478): Caused by: java.lang.NullPointerException
01-18 18:02:51.803: E/AndroidRuntime(4478):     at com.matt.drapp.UploadOption.<init>(UploadOption.java:32)
01-18 18:02:51.803: E/AndroidRuntime(4478):     at java.lang.Class.newInstanceImpl(Native Method)
01-18 18:02:51.803: E/AndroidRuntime(4478):     at java.lang.Class.newInstance(Class.java:1409)
01-18 18:02:51.803: E/AndroidRuntime(4478):     at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
01-18 18:02:51.803: E/AndroidRuntime(4478):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1565)
01-18 18:02:51.803: E/AndroidRuntime(4478):     ... 11 more
4

3 に答える 3

3

問題はIntentコードが原因です。onCreate()アクティビティは後でのみ初期化され、アクティビティが初期化される前にインテント値を取得しようとしていることを忘れないでください。

以下のコードを中に入れてくださいonCreate();

Intent extras = getIntent();
String optionid = extras.getStringExtra("KEY_OPTION");
String duration = extras.getStringExtra("KEY_DURATION");
String reward = extras.getStringExtra("KEY_REWARD");

動作するはずです。

于 2013-01-19T04:59:18.813 に答える
1

例のどの行がNullPointerExceptionを引き起こしていますか。単にtextViewが見つからない場合は、テキストを設定しようとしただけでアプリ全体がクラッシュする可能性があり、それがnullオブジェクトであるためです。

したがって、最初に、textviewのものをコメントアウトして、それがまだ機能するかどうかを確認します。そうでない場合は、明らかにここと同じではないので、クラスの32行目がどの行であるかを教えてください。

于 2013-01-19T03:05:37.903 に答える
0

問題は、getRegistratonIDがnullを返していることです。これは、実際にGCMサーバーに登録する前に、アクティビティクラスで呼び出しており、GCMIntentServiceへのonRegisteredコールバックを受信するためです。getRegistrationIDがnullを返す場合は、AsyncTaskを起動してGCMRegistrar.registerを呼び出す必要があります。

ここの指示に従ってください:

于 2013-03-24T05:31:18.670 に答える