Asynctask奇怪的行为

时间:2013-12-19 10:33:17

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

我用asynctask遇到了一些奇怪的警告。我正在学习GCM,所以我尝试使用asynctask。 这是警告:

Type safety: The method execute(Object...) belongs to the raw type AsyncTask. References to generic type AsyncTask<Params,Progress,Result> should be parameterized

我想了解这个警告的含义。它是关于线程的。为什么它不安全?这是什么原料?

这是我的代码:

private void registerInBackground() {
    // TODO Auto-generated method stub



    new AsyncTask() {
        @Override
        protected Object doInBackground(Object... arg0) {
            // TODO Auto-generated method stub
            String msg = "";
            try {
                if (gcm == null) {
                    gcm = GoogleCloudMessaging.getInstance(getApplicationContext());
                }
                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.
                // The request to your server should be authenticated if your app
                // is using accounts.
                sendRegistrationIdToBackend();

                // 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(getApplicationContext(), 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;
        }   @Override
        protected void onPostExecute(Object result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            Toast.makeText(getApplicationContext(), ""+result.toString(), Toast.LENGTH_LONG).show();
        }
    }.execute(null, null, null);



}

由于

3 个答案:

答案 0 :(得分:3)

AsyncTask是可以参数化的generic Class。警告意味着您应该明确命名参数。

AsyncTask定义为AsyncTask<Params,Progress,Result>,它需要3个参数ParamsProgressResult,可以是任何类型/类。

在上面的代码中,您在doInBackground()中返回一个字符串。 doInBackground()的返回值是AsyncTaskResult)的第三个参数。

要使警告消失,请按照以下方式实施AsyncTask

new AsyncTask<Void, Void, String>() {
        @Override
        protected String doInBackground(Void... voids) {
            String message = "";

            //do something

            return message;
        }

        @Override
        protected void onPostExecute(String result) {

        }
    }.execute();

答案 1 :(得分:1)

通常AsyncTask使用/实例化参数... AsyncTask<Params, Progress, Result>。参数表示的是:

  • 参数:
  • 您将Objects传递给doInBackground()。例如,如果我将Params初始化为String,我现在可以使用doInBackground(String... params)params[0]params[1]访问字符串参数。这是您指定的最重要的参数之一,因为在调用AsyncTask时,您可以发送doInBackground线程中所需的参数。比如新的AsyncTask().execute(string);

  • 的进展:
  • 当使用AsyncTask时,通常会占用用于加载内容等的活动。您可以使用progress参数为用户提供上下文,说明事情按照他们应该的方式进行。假设您阻止用户界面告诉用户它正在下载内容。通过此进度,您可以指定已下载了多少内容。例如,如果此参数为integer,我可以调用publishProgress()主题中的doInBackground来显示当前正在下载的内容的进度。

  • 结果:
  • 通常,这是允许与用户界面交互的唯一参数。假设您已完成下载内容。并且希望指定操作完成,显示成功消息。这是你这样做的地方。例如,您希望返回String表示下载现已完成。在你的doInBackground帖子中,return string;结尾。因此,该值将传递到onPostExecute(String result)。从那里你可以设置textView.setText(result)

    基本上AsyncTask基于GENERICSVARARGS的主体(java概念)

    GENERICS暗示AsyncTask中的参数可以是任何类型,VARARGS指定您可以在这些参数中发送多个值。

    在您的情况下,由于您没有做任何非常重要的更改UI,您可以调用AsyncTask<Void, Void, Void>。为了更好地了解AsyncTask的工作原理,您可以看到以下example

    这是一个很长的阅读,但希望这可以解决问题:)

    答案 2 :(得分:0)

    它与泛型有关。 AsyncTask类的输入为AsyncTask<Params, Progress, Result>。您收到的消息是因为您正在进行new AsyncTask()。您应该做的事情就像new AsyncTask<Void, Void, Void>(),因为您无论如何也不会使用这些类型。

    API参考有关于主题的更多信息。enter link description here