使用Android GCM和AsyncTask get()方法获取注册ID

时间:2014-05-23 14:10:26

标签: android android-asynctask registration google-cloud-messaging

我目前正在尝试设置我的应用程序以注册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,我不知道为什么。

0 个答案:

没有答案
相关问题