我用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);
}
由于
答案 0 :(得分:3)
AsyncTask是可以参数化的generic Class。警告意味着您应该明确命名参数。
AsyncTask定义为AsyncTask<Params,Progress,Result>
,它需要3个参数Params
,Progress
和Result
,可以是任何类型/类。
在上面的代码中,您在doInBackground()
中返回一个字符串。 doInBackground()
的返回值是AsyncTask
(Result
)的第三个参数。
要使警告消失,请按照以下方式实施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基于GENERICS
和VARARGS
的主体(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