异步任务崩溃
Crash with Async Task
很抱歉我的问题,但我在 android 工作室非常菜鸟。
我有一个应用程序,它是一个简单的 Web 视图应用程序,每次在网站中添加新内容时都会推送通知。我正在尝试注册 google 云消息,我一直在尝试向三台设备发送推送通知消息,但总是得到相同的结果:
{"multicast_id":5069213226545235739,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"NotRegistered"}]}{"registration_ids":["APA91bEl0UpCC7r0BcpYpI-4l_XGSXrUR1cMMQM2it2rIhICX61FQSIBXAN2_fE2INxG8PE2F8gcPtJgHX-Gm78YhPuDO6j1UFU0lUpK....etc"],"data":{"message":"New content available!"}}
我试过将服务器密钥更改为浏览器密钥等...
我终于设法删除了共享首选项,重新编译了我的应用程序,然后我意识到我的应用程序在后台使用异步任务注册时崩溃了。我以前从未通知过,因为 reg_id 存储在共享首选项中。我从 google 示例中复制了异步任务,
然而,我被 android studio 和他的语法所困,如果错误是,一些帮助会很容易找到。
这是我的崩溃日志:
FATAL EXCEPTION: AsyncTask #1
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask.done(AsyncTask.java:200)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
at java.lang.Thread.run(Thread.java:1019)
Caused by: java.lang.NullPointerException
at com.example.alfredo.webapp.MainActivity.doInBackground(MainActivity.java:215)
at com.example.alfredo.webapp.MainActivity.doInBackground(MainActivity.java:197)
at android.os.AsyncTask.call(AsyncTask.java:185)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
at java.lang.Thread.run(Thread.java:1019)
这是我的代码:
private void registerInBackground() {
new AsyncTask<Void,Void,String>() {
@Override
protected String doInBackground(Void... params) {
String msg = "";
try {
regid = gcm.register(SENDER_ID);
msg = "Device registered, registration id=" + regid;
// You should send the registration ID to your server over HTTP,
// so it can use GCM/HTTP or CCS to send messages to your app.
// For this demo: we don't need to send it because the device
// will send upstream messages to a server that will echo back
// the message using the 'from' address in the message.
// Save the regid for future use - no need to register again.
SharedPreferences.Editor editor = prefs.edit();
editor.putString(PROPERTY_REG_ID, regid);
editor.commit();
} catch (IOException ex) {
msg = "Error :" + ex.getMessage();
}
return msg;
}
// Once registration is done, display the registration status
// string in the Activity's UI.
@Override
protected void onPostExecute(String msg) {
mDisplay.append(msg + "\n");
}
}.execute();
}
初始化gcm = GoogleCloudMessaging.getInstance(this);
请检查您的 MainActivity.java
中第 215 行的内容
大胆猜测:要么是 'gcm' 要么是 'prefs'。
请在调用.execute()之前检查它们是否已初始化;
您的代码的第 #215 行是什么?
从您的代码看来,gcm
、prefs
或 mDisplay
中的任何一个都可以为 null 以显示此错误..
很抱歉我的问题,但我在 android 工作室非常菜鸟。
我有一个应用程序,它是一个简单的 Web 视图应用程序,每次在网站中添加新内容时都会推送通知。我正在尝试注册 google 云消息,我一直在尝试向三台设备发送推送通知消息,但总是得到相同的结果:
{"multicast_id":5069213226545235739,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"NotRegistered"}]}{"registration_ids":["APA91bEl0UpCC7r0BcpYpI-4l_XGSXrUR1cMMQM2it2rIhICX61FQSIBXAN2_fE2INxG8PE2F8gcPtJgHX-Gm78YhPuDO6j1UFU0lUpK....etc"],"data":{"message":"New content available!"}}
我试过将服务器密钥更改为浏览器密钥等... 我终于设法删除了共享首选项,重新编译了我的应用程序,然后我意识到我的应用程序在后台使用异步任务注册时崩溃了。我以前从未通知过,因为 reg_id 存储在共享首选项中。我从 google 示例中复制了异步任务, 然而,我被 android studio 和他的语法所困,如果错误是,一些帮助会很容易找到。 这是我的崩溃日志:
FATAL EXCEPTION: AsyncTask #1
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask.done(AsyncTask.java:200)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
at java.lang.Thread.run(Thread.java:1019)
Caused by: java.lang.NullPointerException
at com.example.alfredo.webapp.MainActivity.doInBackground(MainActivity.java:215)
at com.example.alfredo.webapp.MainActivity.doInBackground(MainActivity.java:197)
at android.os.AsyncTask.call(AsyncTask.java:185)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
at java.lang.Thread.run(Thread.java:1019)
这是我的代码:
private void registerInBackground() {
new AsyncTask<Void,Void,String>() {
@Override
protected String doInBackground(Void... params) {
String msg = "";
try {
regid = gcm.register(SENDER_ID);
msg = "Device registered, registration id=" + regid;
// You should send the registration ID to your server over HTTP,
// so it can use GCM/HTTP or CCS to send messages to your app.
// For this demo: we don't need to send it because the device
// will send upstream messages to a server that will echo back
// the message using the 'from' address in the message.
// Save the regid for future use - no need to register again.
SharedPreferences.Editor editor = prefs.edit();
editor.putString(PROPERTY_REG_ID, regid);
editor.commit();
} catch (IOException ex) {
msg = "Error :" + ex.getMessage();
}
return msg;
}
// Once registration is done, display the registration status
// string in the Activity's UI.
@Override
protected void onPostExecute(String msg) {
mDisplay.append(msg + "\n");
}
}.execute();
}
初始化gcm = GoogleCloudMessaging.getInstance(this);
请检查您的 MainActivity.java
中第 215 行的内容大胆猜测:要么是 'gcm' 要么是 'prefs'。
请在调用.execute()之前检查它们是否已初始化;
您的代码的第 #215 行是什么?
从您的代码看来,gcm
、prefs
或 mDisplay
中的任何一个都可以为 null 以显示此错误..