在我的应用程序中,我为gcm ccs(xmpp)运行这些代码,代码显示以下错误执行doinbackground.excute()
时出错
这是代码:
sendTask = new AsyncTask<String, String, String>() {
protected String doInBackground(String... title) {
Bundle data = new Bundle();
data.putString("ACTION", action);
data.putString("CLIENT_MESSAGE", "Hello GCM CCS XMPP!");
String id = Integer.toString(ccsMsgId.incrementAndGet());
try {
Log.d("RegisterActivity", "messageid: " + id);
gcm.send(SENDER_ID + "@gcm.googleapis.com", id,
data);
Log.d("RegisterActivity", "After gcm.send successful.");
} catch (IOException e) {
Log.d("RegisterActivity", "Exception: " + e);
e.printStackTrace();
}
return "Sent message.";
}
protected void onPostExecute(String result) {
sendTask = null;
// tosat about the success in return
}
};
sendTask.execute(null, null, null);
答案 0 :(得分:13)
你的sendTask
如何宣布?我想它只是AsyncTask sendTask;
,如果是这样,那么将它改为:
AsyncTask<String, String, String> sendTask;
此异常的原因类似于以下代码中出现的原因:
Object arr1[] = new Object[] {null,null,null};
String arr2[] = (String[])arr1; // here java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
java中的VarArgs实现为数组,因此当您将sendTask声明为AsyncTask<String, String, String>
时,编译器会使用doInBackground
调用new String[]{null,null,null}
,但当您将其声明为AsyncTask
时然后使用doInBackground
调用new Object[]{null,null,null}
。
由于类型擦除,编译器会将隐藏的隐式强制转换从Object[]
添加到String[]
。这是为了允许以下代码正常工作:
AsyncTask sendTask = ...;
Object[] arg = new String[]{null,null,null};
sendTask.execute(arg);
答案 1 :(得分:0)
尝试
sendTask.execute(new String[]{""});
而不是
sendTask.execute(null, null, null);