获取 GCM 实例 ID 的空指针

Posted

技术标签:

【中文标题】获取 GCM 实例 ID 的空指针【英文标题】:Get Null Pointer for GCM Instance ID 【发布时间】:2015-10-28 01:14:38 【问题描述】:

我想将我的设备注册到我的 gcm。在我的另一个应用程序中,此代码工作正常。但在这个应用程序中,这段代码得到空指针。这是我的代码

private void registerInBackground(final String emailID) 
        new AsyncTask<Void, Void, String>() 
            @Override
            protected String doInBackground(Void... params) 
                String msg = "";
                try 
                    if (gcmObj == null) 
                        instanceID = InstanceID.getInstance(applicationContext);
                    
                    regId = instanceID.getToken(ApplicationConstants.GOOGLE_PROJ_ID,
                            GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
                    msg = "Registration ID :" + regId;
                    try 
                        GcmPubSub.getInstance(getApplicationContext()).subscribe(regId, "/topics/global", null);
                    catch (Exception e)
                        Toast.makeText(getApplicationContext(),e.getMessage().toString()+"Gagal Subcribe",Toast.LENGTH_LONG).show();
                    
                 catch (IOException ex) 
                    msg = "Error :" + ex.getMessage();
                
                return msg;
            

            @Override
            protected void onPostExecute(String msg) 
                if (!TextUtils.isEmpty(regId)) 
                    // Store RegId created by GCM Server in SharedPref
                    SharedPreferences prefs = getSharedPreferences("UserDetails", Context.MODE_PRIVATE);
                    SharedPreferences.Editor editor = prefs.edit();
                    editor.putString("regId",regId);
                    startActivity(new Intent(getApplicationContext(),Home.class));
                    finish();
                    /*Toast.makeText(
                            applicationContext,
                            "Registered with GCM Server successfully.\n\n"
                                    + msg, Toast.LENGTH_SHORT).show();*/
                 else 
                    Toast.makeText(
                            applicationContext,
                            "Reg ID Creation Failed.\n\nEither you haven't enabled Internet or GCM server is busy right now. Make sure you enabled Internet and try registering again after some time."
                                    + msg, Toast.LENGTH_LONG).show();
                
            
        .execute(null, null, null);

    

这是我的空指针异常。

08-05 16:58:19.741  26139-26464/? E/androidRuntime﹕ FATAL EXCEPTION: AsyncTask #1
    Process: com.fingerspot.fingerspot, PID: 26139
    java.lang.RuntimeException: An error occured while executing doInBackground()
            at android.os.AsyncTask$3.done(AsyncTask.java:300)
            at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
            at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
            at java.util.concurrent.FutureTask.run(FutureTask.java:242)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:841)
     Caused by: java.lang.NullPointerException
            at com.google.android.gms.iid.InstanceID.zza(Unknown Source)
            at com.google.android.gms.iid.InstanceID.getInstance(Unknown Source)
            at com.fingerspot.fingerspot.Login$2.doInBackground(Login.java:145)
            at com.fingerspot.fingerspot.Login$2.doInBackground(Login.java:139)
            at android.os.AsyncTask$2.call(AsyncTask.java:288)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:841)

我的代码有什么问题?因为这段代码在我的另一个应用程序中工作正常,但是为这个应用程序获取空指针。

【问题讨论】:

什么是行 Login.java:145 你在那里得到一个 NPE this, instanceID = InstanceID.getInstance(applicationContext); 但这段代码在我的另一个应用程序中很好 您的applicationContext 似乎为空。你在哪里初始化你的applicationContext ?? 尝试使用 Yourclassname.this 而不是 applicationcontext 【参考方案1】:

使用 getApplicationContext() 代替 applicationContext

【讨论】:

哦,好的,谢谢,我解决了我的问题。但为什么我应该使用 getApplicationContext() 而不是 Context applicationContext ?为什么这段代码在我的另一个应用程序中工作?但无法在此应用中使用? 它看起来像在另一个应用程序中你在某个地方实例化了变量 applicationContext 但在这个应用程序中没有这样做,你也可以添加 Context applicationContext = getApplicationContext();然后像以前一样使用它【参考方案2】:

因为您的 applicationContext 为空。在您的 Activity 中,最好在 onCreate 方法中初始化它,例如:

applicationContext = YourActivity.this;

或者试试这个:

instanceID = InstanceID.getInstance(getApplicationContext());

或者试试这个:

instanceID = InstanceID.getInstance(YourActivity.this);

【讨论】:

先生,我可以再问 1 个问题吗?

以上是关于获取 GCM 实例 ID 的空指针的主要内容,如果未能解决你的问题,请参考以下文章

获取表单信息,进行对比时的空指针错误

为什么我得到一个对象数组的空指针异常? [重复]

列表视图中的空指针异常?

处理来自 JsonReader 的空指针

服务器中的空指针异常

Spring MVC 项目中的空指针异常