Android AsyncTask (возвращает целое число из doInBackground) - PullRequest
0 голосов
/ 30 ноября 2011

Я получаю следующие ошибки в коде ниже: Тип возвращаемого значения несовместим с AsyncTask.onPostExecute (Integer).Я пытаюсь вернуть результат из http-запроса, выполненного в задаче doInBackground.Я получаю сообщение об ошибке: Несоответствие типов: невозможно преобразовать AsyncTask в int в операторе возврата для isAvailable.Я чувствую, что есть что-то простое, что я не делаю, но я не могу понять это.

    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 ]

2 голосов
/ 30 ноября 2011

О, я думаю, я вижу проблему. Я не думаю, что вы можете справиться с этим так, как вы делаете это в настоящее время. Вы должны обрабатывать эффекты значения isAvail в методе onPostExecute(). isAvailable() работает в главном потоке, а isAvail работает в отдельном потоке. Вы пытаетесь вернуть результат AsyncTask до его завершения.

Я на 99% уверен, что это проблема.

2 голосов
/ 30 ноября 2011

Я верю, что вы ищете

Integer nisAvail = isAvail.execute(position).get();

но тогда задача больше не является асинхронной, поскольку поток пользовательского интерфейса должен ждать, пока AsyncTask завершит работу.

Если вы хотите сохранить его асинхронным, вы должны обработать результат в onPostExecute.

1 голос
/ 30 ноября 2011

Возвращаемое значение int:

return Integer.parseInt(br.readLine().trim());

это также возвращает int:

return 0;

Вы должны вернуть целое число:

return new Integer(br.readLine().trim());

return new Integer(0);
0 голосов
/ 21 ноября 2014

Если вы хотите получить значение, возвращаемое методом doInBackground.Затем сделайте это:

Integer Value = AsyncTaskClass.execute(ParamsIfSpecified).get();
...