onPostExecute AsyncTask GCMServices 中的 NullPointerException
NullPointerException in onPostExecute AsyncTask GCMServices
当我尝试注册到 GCMServices 以获取推送通知时,我在 onPostExecute() 中收到来自 AsyncTask 的 NullPointerException。我按照他们的教程阅读了其他 Whosebug 帖子。
我的代码:
registerInBackground()
private void registerInBackground() {
new AsyncTask<Void, Void, String>() {
@Override
protected String doInBackground(Void... params) {
String msg = "";
try {
if (gcm == null) {
gcm = GoogleCloudMessaging.getInstance(context);
}
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
regid = gcm.register(SENDER_ID);
msg = "Device registered, registration ID=" + regid;
storeRegistrationId(context, regid);
} catch (IOException ex) {
msg = "Error :" + ex.getMessage();
}
return msg;
}
@Override
protected void onPostExecute(String msg) {
mDisplay.append(msg + "\n");
}
}.execute(null, null, null);
}
和 storeRegistrationId():
private void storeRegistrationId(Context context, String regId) {
final SharedPreferences prefs = getGCMPreferences(context);
int appVersion = getAppVersion(context);
Log.i(TAG, "Saving regId on app version " + appVersion);
SharedPreferences.Editor editor = prefs.edit();
editor.putString(PROPERTY_REG_ID, regId);
editor.putInt(PROPERTY_APP_VERSION, appVersion);
editor.commit();
}
LOGCAT:
java.lang.NullPointerException
at activities.MainActivity.onPostExecute(MainActivity.java:323)
at activities.MainActivity.onPostExecute(MainActivity.java:282)
at android.os.AsyncTask.finish(AsyncTask.java:632)
at android.os.AsyncTask.access0(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5356)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
at dalvik.system.NativeStart.main(Native Method)
MainActivity.java:323 是
protected void onPostExecute(String msg) {
mDisplay.append(msg + "\n"); //line 323
}
和MainActivity.java:282是
new AsyncTask<Void, Void, String>() {
private AsyncTask<Void, Void, Void> mGCMRegisterTask;
mGCMRegisterTask = new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
try {
if (gcm == null) {
gcm = GoogleCloudMessaging.getInstance(getApplicationContext());
}
regid = gcm.register(Config.SENDER_ID);
msg = "Device registered, registration ID=" + regid;
storeRegistrationId(context, regid);
}
catch (IOException ex) {
ex.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
mGCMRegisterTask = null;
}
};
mGCMRegisterTask.execute(null, null, null);
}
还要记住在不使用时停止线程
@Override
protected void onDestroy() {
super.onDestroy();
if (mGCMRegisterTask != null) {
mGCMRegisterTask.cancel(true); //Cancel async task if started.
}
}
你是如何初始化的mDisplay
?我认为你的 mDisplay
是空的。
试试这个
protected void onPostExecute(String msg) {
StringBuffer mDisplay = new StringBuffer();
mDisplay.append(msg + "\n"); //line 323
}
试试这个代码
if(!msg.equels("")&&msg!=null){
mDisplay.append(msg + "\n");
}
else {
System.out.println("msg is empty");
}
当我尝试注册到 GCMServices 以获取推送通知时,我在 onPostExecute() 中收到来自 AsyncTask 的 NullPointerException。我按照他们的教程阅读了其他 Whosebug 帖子。
我的代码:
registerInBackground()
private void registerInBackground() {
new AsyncTask<Void, Void, String>() {
@Override
protected String doInBackground(Void... params) {
String msg = "";
try {
if (gcm == null) {
gcm = GoogleCloudMessaging.getInstance(context);
}
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
regid = gcm.register(SENDER_ID);
msg = "Device registered, registration ID=" + regid;
storeRegistrationId(context, regid);
} catch (IOException ex) {
msg = "Error :" + ex.getMessage();
}
return msg;
}
@Override
protected void onPostExecute(String msg) {
mDisplay.append(msg + "\n");
}
}.execute(null, null, null);
}
和 storeRegistrationId():
private void storeRegistrationId(Context context, String regId) {
final SharedPreferences prefs = getGCMPreferences(context);
int appVersion = getAppVersion(context);
Log.i(TAG, "Saving regId on app version " + appVersion);
SharedPreferences.Editor editor = prefs.edit();
editor.putString(PROPERTY_REG_ID, regId);
editor.putInt(PROPERTY_APP_VERSION, appVersion);
editor.commit();
}
LOGCAT:
java.lang.NullPointerException
at activities.MainActivity.onPostExecute(MainActivity.java:323)
at activities.MainActivity.onPostExecute(MainActivity.java:282)
at android.os.AsyncTask.finish(AsyncTask.java:632)
at android.os.AsyncTask.access0(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5356)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
at dalvik.system.NativeStart.main(Native Method)
MainActivity.java:323 是
protected void onPostExecute(String msg) {
mDisplay.append(msg + "\n"); //line 323
}
和MainActivity.java:282是
new AsyncTask<Void, Void, String>() {
private AsyncTask<Void, Void, Void> mGCMRegisterTask;
mGCMRegisterTask = new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
try {
if (gcm == null) {
gcm = GoogleCloudMessaging.getInstance(getApplicationContext());
}
regid = gcm.register(Config.SENDER_ID);
msg = "Device registered, registration ID=" + regid;
storeRegistrationId(context, regid);
}
catch (IOException ex) {
ex.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
mGCMRegisterTask = null;
}
};
mGCMRegisterTask.execute(null, null, null);
}
还要记住在不使用时停止线程
@Override
protected void onDestroy() {
super.onDestroy();
if (mGCMRegisterTask != null) {
mGCMRegisterTask.cancel(true); //Cancel async task if started.
}
}
你是如何初始化的mDisplay
?我认为你的 mDisplay
是空的。
试试这个
protected void onPostExecute(String msg) {
StringBuffer mDisplay = new StringBuffer();
mDisplay.append(msg + "\n"); //line 323
}
试试这个代码
if(!msg.equels("")&&msg!=null){
mDisplay.append(msg + "\n");
}
else {
System.out.println("msg is empty");
}