3

在创建 GCM 客户端应用程序时,asynctask 出现编译错误。OnCreate 我们正在调用 registerBackgrouod 它将检查 gcm 实例是否正在运行,如果没有创建一个。

但 asyntask 给出错误:“Asynctask 无法解析为一种类型”

private void registerBackground() {
    new AsyncTask() {
        protected String doInBackground(Void... params) {
            String msg = "";
            try {
                if (gcm == null) {
                    gcm = GoogleCloudMessaging.getInstance(context);
                }
                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 echo back the message
                // using the 'from' address in the message.

                // Save the regid - no need to register again.
                setRegistrationId(context, regid);
            } catch (IOException ex) {
                msg = "Error :" + ex.getMessage();
            }
            return msg;
        }


        protected void onPostExecute(String msg) {
            mDisplay.append(msg + "\n");
        }
    }.execute(null, null, null);
4

2 回答 2

0

正如 AlexBcn 已经观察到的,并且根据AsyncTask的文档,您可以将三种类型作为参数传递给 AsyncTask。因为您想将 GCM 推送通知的有效负载作为字符串返回,所以您将调用AsyncTask<Void, Void, String>

所以GCM客户端正确的代码片段是:

    private void registerInBackground() {
      new AsyncTask<Void, Void, String>() {
        @Override
        protected String doInBackground(Void... params) {
            String msg = "";
            try {
                if (gcm == null) {
                    gcm = GoogleCloudMessaging.getInstance(context);
                }
                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 echo back the message using the
                // 'from' address in the message.

                // Persist the regID - no need to register again.
                storeRegistrationId(context, regid);
            } catch (IOException ex) {
                msg = "Error :" + ex.getMessage();
                // If there is an error, don't just keep trying to register.
                // Require the user to click a button again, or perform
                // exponential back-off.
            }
            return msg;
        }.execute(null, null, null);
    }
于 2014-11-18T12:53:14.523 回答
-1

这是因为您传递给异步任务的参数。如需进一步帮助:我最近将功能齐全的 GCM java 客户端上传到我的 Github 帐户: GCM Android Client

它具有服务器和客户端实现。

于 2014-04-06T20:33:22.117 回答