SNS Android应用程序中的例外情况
问题描述:
我已将AWS SNS API集成到我的Android应用程序中。当我打开应用程序,我得到这个错误日志:SNS Android应用程序中的例外情况
E/GCMTokenHelper: Unable to register with GCM. MAIN_THREAD
java.io.IOException: MAIN_THREAD
at com.google.android.gms.iid.InstanceID.getToken(Unknown Source)
at com.google.android.gms.iid.InstanceID.getToken(Unknown Source)
at com.amazonaws.mobile.push.GCMTokenHelper.updateGCMToken(GCMTokenHelper.java:79)
at com.amazonaws.mobile.push.PushManager.registerDevice(PushManager.java:196)
at com.intap.appme.MainActivity.onCreate(MainActivity.java:49)
at android.app.Activity.performCreate(Activity.java:6876)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1135)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3206)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349)
at android.app.ActivityThread.access$1100(ActivityThread.java:221)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7224)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
10-01 20:54:37.354 4725-4725/com.intap.appme E/PushManager: Push Notifications - FAILED : GCM registration failed : java.io.IOException: MAIN_THREAD
java.io.IOException: MAIN_THREAD
at com.google.android.gms.iid.InstanceID.getToken(Unknown Source)
at com.google.android.gms.iid.InstanceID.getToken(Unknown Source)
at com.amazonaws.mobile.push.GCMTokenHelper.updateGCMToken(GCMTokenHelper.java:79)
at com.amazonaws.mobile.push.PushManager.registerDevice(PushManager.java:196)
at com.intap.appme.MainActivity.onCreate(MainActivity.java:49)
at android.app.Activity.performCreate(Activity.java:6876)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1135)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3206)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349)
at android.app.ActivityThread.access$1100(ActivityThread.java:221)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7224)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
10-01 20:54:39.724 4725-4725/com.intap.appme E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.intap.appme, PID: 4725
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.intap.appme/com.intap.appme.MainActivity}: com.amazonaws.services.sns.model.InvalidParameterException: Invalid parameter: Endpoint (Service: AmazonSNS; Status Code: 400; Error Code: InvalidParameter; Request ID: 698306d3-9079-53a0-8dc2-56ba6ae67d2b)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3253)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349)
at android.app.ActivityThread.access$1100(ActivityThread.java:221)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7224)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
Caused by: com.amazonaws.services.sns.model.InvalidParameterException: Invalid parameter: Endpoint (Service: AmazonSNS; Status Code: 400; Error Code: InvalidParameter; Request ID: 698306d3-9079-53a0-8dc2-56ba6ae67d2b)
at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:712)
at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:388)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:199)
at com.amazonaws.services.sns.AmazonSNSClient.invoke(AmazonSNSClient.java:2262)
at com.amazonaws.services.sns.AmazonSNSClient.subscribe(AmazonSNSClient.java:1256)
at com.amazonaws.mobile.push.PushManager.subscribeToTopic(PushManager.java:251)
at com.intap.appme.MainActivity.onCreate(MainActivity.java:50)
at android.app.Activity.performCreate(Activity.java:6876)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1135)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3206)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349)
at android.app.ActivityThread.access$1100(ActivityThread.java:221)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7224)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
这是在错误日志中提到的系是: GCMTokenHelper.java:79
newDeviceToken = instanceID.getToken(gcmSenderID, GoogleCloudMessaging.INSTANCE_ID_SCOPE);
PushManager.java:196
gcmTokenHelper.updateGCMToken();
PushManager.java:251
final SubscribeResult result = sns.subscribe(request);
MainActivity.java:49
pushManager.registerDevice();
MainActivity.java:50
pushManager.subscribeToTopic(pushManager.getDefaultTopic());
我并没有真正理解什么是在我的代码的问题,所以你能帮帮我吗?
答
这不是那么直观,错误信息只是说MAIN_THREAD
在最后没有解释。这有效地表明pushManager.registerDevice()
方法不能从主线程调用。
Mobile Hub示例应用程序在Async任务中进行呼叫。这是一个例子。
new AsyncTask<Void, Void, String>() {
@Override
protected String doInBackground(final Void... params) {
// register device first to ensure we have a push endpoint.
pushManager.registerDevice();
// if registration succeeded.
if (pushManager.isRegistered()) {
if (pushManager.isPushEnabled()) {
// if push is enabled, the push manager keeps its state
// including the subscribed topics and automatically
// re-subscribes when registering the device.
return null;
}
try {
// Enable push
pushManager.setPushEnabled(true);
// Automatically subscribe to the default SNS topic
pushManager.subscribeToTopic(pushManager.getDefaultTopic());
return null;
} catch (final AmazonClientException ace) {
Log.e(LOG_TAG, "Failed to change push notification status", ace);
return ace.getMessage();
}
}
return "Failed to register for push notifications.";
}
@Override
protected void onPostExecute(final String errorMessage) {
if (errorMessage != null) {
// do something to show the error message...
}
}
}.execute();
既然你当前正在调用从活动的onCreate()
生命周期方法PushManager.registerDevice()
,你是从主线程,这是不允许的调用它。切换到在后台线程中调用它,例如使用上面的AsyncTask
示例,并且应该解决您的问题。