我目前正在尝试设置我的应用程序以注册Google GCM以获取注册ID。
我按照Google Developers网站上的文档进行操作,到目前为止一切运行良好。
我的应用程序的上下文是我有一个库应用程序,它应该获得令牌注册ID,而使用该库的主机应用程序将处理通知。
在文档中没有很好地解释,但似乎完全可以将这两个操作(获取令牌/处理通知)分离到主机应用程序和库应用程序中(通过选择正确的权限/要为每个项目添加的类。)
要获取注册ID,您需要创建一个Asynctask,它将调用gcm.register(SENDER_ID)方法。
我的问题是,我需要等待这个Asynctask的结果然后继续我当前的应用程序中的结果。
我的Asynctask如下:
public class PushTask extends AsyncTask<Void, Void, String> {
private GoogleCloudMessaging gcm;
private String regId;
public PushTask(Context ctx){
this.gcm = GoogleCloudMessaging.getInstance(ctx);
this.regId = "";
}
@Override
protected String doInBackground(Void... params) {
Log.v("PushTask", "Start getting GCM Token / Sender Id : "+CURRENT_SENDER_ID);
try {
this.regId = this.gcm.register(CURRENT_SENDER_ID);
} catch (IOException ex) {
try {
this.regId = this.gcm.register(CURRENT_SENDER_ID);
} catch (IOException e) {
e.printStackTrace();
}
}
Log.v("PushTask", "Should have GCM Token now : "+this.regId);
return this.regId;
}
}
这是有效的,但如果我这样调用我的AsyncTask:
PushTask pt = new PushTask(this.ctx);
String token = pt.execute().get();
我系统地获得了SERVICE_NOT_AVAILABLE异常,
有谁知道为什么?因为我在搜索网络时没能找到更多信息, 并且有人知道我没有其他选择,而不是使用我的Asynctask的onPostExecute方法来处理它,如果可能的话,我试图避免这种方法。
在SERVICE_NOT_AVAILABLE异常的堆栈跟踪下面:
05-23 16:59:47.441: W/System.err(13060): java.io.IOException: SERVICE_NOT_AVAILABLE
05-23 16:59:47.441: W/System.err(13060): at com.google.android.gms.gcm.GoogleCloudMessaging.register(Unknown Source)
05-23 16:59:47.441: W/System.err(13060): at *.push.PushTask.doInBackground(PushTask.java:29)
05-23 16:59:47.441: W/System.err(13060): at *.push.PushTask.doInBackground(PushTask.java:1)
05-23 16:59:47.441: W/System.err(13060): at android.os.AsyncTask$2.call(AsyncTask.java:287)
05-23 16:59:47.441: W/System.err(13060): at java.util.concurrent.FutureTask.run(FutureTask.java:234)
05-23 16:59:47.441: W/System.err(13060): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
05-23 16:59:47.441: W/System.err(13060): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
05-23 16:59:47.441: W/System.err(13060): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
05-23 16:59:47.441: W/System.err(13060): at java.lang.Thread.run(Thread.java:841)
我似乎得到了这个例外,因为我试图在主线程中调用AsyncTask的get()方法确实(请参阅下面的Emannuel评论),因为它和&#39; #39; s禁止在主线程上调用get()方法,
但Android不会抛出networkOnmainThreadException,而是抛出一个SERVICE_NOT_AVAILABLE IOException,我不知道为什么。