Обратный вызов из Async в библиотеке функций - PullRequest
2 голосов
/ 31 января 2012

Я собираю свое первое приложение для Android, которое является также моим введением в язык программирования Java, и поэтому я спотыкаюсь о том, что может быть некоторыми очень основными понятиями.

Мой план состоит в том, чтобы установитьсоздать сервер, полный функций php, и поместить все вызовы php в одну статическую библиотеку функций.Я мог бы изменить этот статический класс на singleton, если это упростит эту проблему.

Изнутри действия я делаю следующий вызов:

phpCalls.VerifyAccount(userName, password);

и внутри статического класса phpCalls яПолучил следующий код:

    PHP_AsyncTask validateAccountTask = new PHP_AsyncTask();
    validateAccountTask.execute(new String[] {DOMAIN + PHP_confirm_account_exists, username, password});

и

private static class PHP_AsyncTask extends AsyncTask<String, Void, String>{
    //This class should take the full URL of the php function to call and return the string result. Somehow.
    @Override
    protected String doInBackground(String... args)
    {
        String response = "";

        try
        {
            String url = args[0];
            String username = args[1];
            String password = args[2];
            URL validateURL = new URL(url);
            String credentials = "Basic " + new String(Base64.encode((username + ":" + password).getBytes(), Base64.NO_WRAP)) ;

            //TODO: handle 501 result
            HttpURLConnection conn = (HttpURLConnection)validateURL.openConnection();
            conn.setDoOutput(true);
            conn.setRequestProperty("Authorization",credentials);

            BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String line;

            while ((line = reader.readLine()) != null)
            {
                response += line;
            }
            reader.close();
        }
        catch (IOException ioe)
        {
            ioe.printStackTrace();
        }

        return response;
    }


    @Override
    protected void onPostExecute(String result)
    {
        //have something happen when the php returns - need to pass the result somewhere
    }

Извините, если форматирование кода не является идеальным - я не являюсь постоянным постером на Stackoverflow.

В любом случае, я пытаюсь определить, как лучше всего обработать результат из вызова php - он возвращается в функцию onPostExecute класса PHP_AsyncTask как результат, но мне нужно как-то передать его обратно в поток пользовательского интерфейса.Очевидно, я не могу создать указатель на функцию в моей деятельности и передать ее в асинхронный класс.Есть ли способ создать слушатель в моей деятельности и передать его так, чтобы я мог передать результат из PHP_AsyncTask обратно в свою деятельность?Или я полностью лаю не на том дереве - есть какой-то предпочтительный подход, который я должен использовать?

Ответы [ 2 ]

2 голосов
/ 31 января 2012

1) onPostExecute равно в потоке пользовательского интерфейса

2) Вместо указателя на функцию вы можете передать указатель на интерфейс.Например, если у вас есть такой интерфейс

public interface Listener{
    public void someFunc(String response);
}

, вы можете передать в качестве параметра любой класс, реализующий этот интерфейс.Например, если ваш метод

public void sendRequest(Listener listener);

, вы можете передать как listener ваш класс:

public class SomeClass implements Listener{
    public void someFunc(String response){
        //do stuff
    }
}

вот так

sendRequest(new SomeClass());

PS Я не использовал AsyncTask в своем ответе, но я надеюсь, что вы поймете идею

0 голосов
/ 31 января 2012

Поэтому у меня нет возможности проверить это прямо сейчас, но вот что я хотел бы сделать.

Создать интерфейс для слушателя

public interface MyListener {
    public void onDone(String response);
}

Из вызова действия VerifyAccountнапример,

phpCalls.VerifyAccount(userName,password, new MyListener() {
    @Override
    public void onDone(String response) {
        //do stuff
    }
});

Затем измените конструктор для PHP_AsyncTask, чтобы он содержал один параметр, созданный вами интерфейс.Измените подпись метода для VerifyAccount, чтобы получить дополнительный параметр и передать его в новую созданную вами PHP_AsyncTask.

private static class PHP_AsyncTask extends AsyncTask<String, Void, String>{ 
    private MyListener listener;
    public PHP_AsyncTask (MyListener listener) {
        this.listener = listener;
    }

   .....

   @Override
   protected void onPostExecute(String result)
   {
      listener.onDone(result);
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...