Android AsyncTask(从doInBackground返回一个Integer)

时间:2011-11-30 00:02:24

标签: android android-asynctask return-value

我在下面的代码中遇到以下错误:返回类型与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; 
        } 

4 个答案:

答案 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();