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");
    }