我在下面的代码中遇到以下错误:返回类型与AsyncTask.onPostExecute(Integer)不兼容。我正在尝试从doInBackground任务中完成的http请求返回结果。我得到错误:类型不匹配:无法在isAvailable的return语句中从AsyncTask转换为int。我觉得我有一些简单的事情,但我无法弄明白。
public int isAvailable(int position) {
GetIsAvailable isAvail = new GetIsAvailable();
Integer nisAvail = isAvail.execute(position); // error is still here
return nisAvail;
}
private class GetIsAvailable extends AsyncTask<Integer,Void,Integer > {
@Override
protected Integer doInBackground(Integer...position) {
Bundle resBundle = new Bundle();
String url = "http://www.testurl.com"
+ position[0]+"&uname="+AppStatus.mUserName;
URL iuri;
try {
iuri = new URL(url);
URLConnection connection = iuri.openConnection();
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);
connection.setRequestProperty("Content-type",
"application/x-www-form-urlencoded");
BufferedReader br = new BufferedReader(new InputStreamReader(
(InputStream) connection.getContent()));
resBundle.putInt("isAvail", Integer.parseInt(br.readLine().trim()));
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return new Integer(0);
}
@Override
protected Integer onPostExecute(Integer isAvail) { // Main Error here
return isAvail;
}
答案 0 :(得分:2)
哦,我想我看到了问题。我认为你不能像现在这样处理它。您应该在isAvail
方法中处理onPostExecute()
值的影响。 isAvailable()
正在主线程上运行,而isAvail
正在一个单独的线程上运行。您正在尝试在完成之前返回AsyncTask的结果。
我99%肯定这就是问题所在。
答案 1 :(得分:2)
我相信你要找的是
Integer nisAvail = isAvail.execute(position).get();
但随后该任务不再异步,因为UI线程必须等到AsyncTask完成。
如果要保持异步,则必须在onPostExecute中处理结果。
答案 2 :(得分:1)
这返回一个int:
return Integer.parseInt(br.readLine().trim());
这也返回一个int:
return 0;
您必须返回一个整数:
return new Integer(br.readLine().trim());
return new Integer(0);
答案 3 :(得分:-1)
如果您想从doInBackground
方法返回值。
然后这样做:
Integer Value = AsyncTaskClass.execute(ParamsIfSpecified).get();