Шаблон, чтобы сделать AsyncTask "процедурным" - PullRequest
8 голосов
/ 13 июня 2011

Я использую AsyncTask во многих местах без проблем.

Теперь с Honeycomb все сетевые операции ввода-вывода должны осуществляться в потоке, отдельном от потока пользовательского интерфейса, который во многих случаях требует AsyncTasks в тех местах, где до синхронного сетевого подключения было хорошо (Honeycomb создает исключение для любой сетевой ввод / вывод в потоке main / ui).

Теперь я бы хотел получить что-то вроде Object result = MyAsyncTask().execute(). Есть ли хорошие шаблоны для этого?

Я нашел AsyncTask Android - шаблон проектирования и возвращаемые значения , который имеет смысл, а также то, как GWT делает вещи, но почему-то это звучит как вилять собакой за хвост (и тогда это может быть просто мне, чей мозг нуждается в еще нескольких поворотах).

Ответы [ 3 ]

13 голосов
/ 14 июля 2011

Да. Ты рядом. Попробуйте

Object result = MyAsyncTask().execute().get();
4 голосов
/ 13 июня 2011

Я уверен, что вы не хотите выполнять синхронную сетевую транзакцию в потоке пользовательского интерфейса, верно?

Шаблон, который я использую, состоит в том, чтобы удерживать состояние в Activity (которая реализует получатель), а затем вызывать AsycTask, который выполняет обратный вызов вашей активности в onPostExecute () (т.е. запускает Intent, который ваша активность прослушивает).Ваша деятельность может затем обновить состояние в соответствии с дополнениями в намерении и продолжить обработку.Это в основном конечный автомат, хранящийся в вашей активности, который выполняет вход в систему и другие функции.Все сетевые операции ввода-вывода выполняются в экземплярах AsycTask, что приводит к обновлению состояния по мере их завершения.

1 голос
/ 13 июня 2011

Если вы просто хотите заблокировать свой поток, в то время как другой поток выполняет свою работу, вы можете написать собственную абстракцию задачи.Я думаю о чем-то вроде

public class MyTask <T>  {
    // define executor here
    public T execute(Callable<T> c) {
        Future<T> t = executor.submit(c);
        return t.get();
    }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...