获取 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 的空指针的主要内容,如果未能解决你的问题,请参考以下文章