Есть ли способ получить Async Task для возврата данных, или иметь возможность отправить параметр с методом для вызова после - PullRequest
2 голосов
/ 17 ноября 2011

У меня есть класс асинхронных задач, который действует как оболочка для http-запросов. Я хочу иметь возможность либо вернуть данные из onPostExecute, либо как-то указать метод для отправки этих данных после. Я не могу просто вызвать функцию явно, потому что разные ответы должны идти к разным методам. Может быть, если что-то вроде call_user_function от php.

 private class Get extends AsyncTask<Void, Void, ContainerData> {

    @Override
    protected void onPreExecute() {
        if (pbTitle != null) {
            pbTitle.setVisibility(View.VISIBLE);
        }
        if (preText != null) {
            tvUpdate.setText(preText);
            tvUpdate.setVisibility(View.VISIBLE);
        }
    }

    @Override
    protected void onProgressUpdate(Void... progress) {

    }

            //this line will not work, the return type wants to be void
    @Override
    protected ContainerData onPostExecute(ContainerData obj) {
        if (pbTitle != null) {
            pbTitle.setVisibility(View.GONE);
        }
        if (preText != null) {
            tvUpdate.setText("");
            tvUpdate.setVisibility(View.GONE);
        }
        updateResponse(obj);

        return obj;

    }

    @Override
    protected ContainerData doInBackground(Void... params) {

        ContainerData obj = null;

        RestClient client = new RestClient(context);

        for (Param param : methodParams) {

            client.AddParam(param.getKey(), param.getValue());
        }

        client.setMethod(method);

        try {
            client.Execute();
        } catch (Exception e) {
            e.printStackTrace();
        }

        obj = client.getResponseObject();

        return obj;
    }

    public String updateResponse(ContainerData responseObject) {


        try {
            // throws API exception
            responseObject.checkSuccess();

            String message = responseObject.getMessage();

            if (message != null) {
                Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
            }

            dataString = responseObject.getDataString();

        } catch (ApiException e) {
            Toast.makeText(context, e.getMessage(), Toast.LENGTH_SHORT).show();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return dataString;

    }
}

Ответы [ 3 ]

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

Вы можете определить интерфейс ICommand:

public interface ICommand
{
    void execute();
}

И создайте новый атрибут для класса Get

private ICommand command;
public void setCommand(ICommand command)
{
      this.command = command
}

Наконец, когда вы создаете экземпляр, установите команду следующим образом:

setCommand(new ICommand() {

        @Override
        public void execute() {
            // Your specific code 
        }
    });

Конечно, если вам нужны данные ответа ContainerData, вы можете изменить интерфейс ICommand, чтобы выполнить получал экземпляр ContainerData.

Надеюсь, это поможет! :)

0 голосов
/ 17 ноября 2011

Использовать обработчик.И на пост выполнения отправить разные сообщения обработчику для другого ответа.Из обработчика вы можете вызывать разные методы.

0 голосов
/ 17 ноября 2011

Вы перепутали порядок в строке:

private class Get extends AsyncTask<Void, Void, ContainerData>

Тип возврата идет первым.Вы должны иметь:

private class Get extends AsyncTask<ContainerData, Void, Void>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...