Синхронные вызовы службы в Android

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

Сервис основан на мыле. Для этого я использую библиотеку ksoap, но давайте перейдем к делу.

Я «звонил в службу» с использованием асинхронных задач. Вроде все шло хорошо, но...

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

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

Производительность ужасна в этом смысле. Как лучше поступить в таком случае? Какую синхронизацию я могу использовать, чтобы не было гонки между запросами?

Как я могу использовать службы Android? Чем они лучше?

Заранее спасибо за ответы.


person Olek    schedule 09.02.2012    source источник
comment
Почему бы вам не выполнять AsyncTasks последовательно и только в случае их успешного выполнения?   -  person dmon    schedule 10.02.2012
comment
Что вы имеете в виду, называя их последовательно?   -  person Olek    schedule 10.02.2012


Ответы (1)


На самом деле вы можете вызвать AsyncTask синхронно:

class MyTask extends AsyncTask<Void,Void,String>
{...}

MyTask x = new MyTask();
String result = x.execute().get();

См. страницу документов для AsyncTask

person Heiko Rupp    schedule 09.02.2012
comment
Спасибо за быстрый ответ. Вы сами пробовали? Поэтому, говоря ему get(), я думаю, он просто вызывает join() в потоке, в котором он выполняется. Не приостановит ли get() пользовательский интерфейс или другие задачи? Существуют ли какие-либо встроенные механизмы для управления очередью задач? - person Olek; 10.02.2012
comment
Я думаю, что в основном ответил на часть синхронизации. Я понял, что вы хотели заблокировать пользовательский интерфейс, пока не получите ответ. И хотя бы с помощью onPreExecute и onPostExecute можно спокойно запускать индикаторы прогресса и т.д. - person Heiko Rupp; 10.02.2012
comment
На самом деле я не хочу замораживать пользовательский интерфейс. И я ищу способ избежать этого. Ищу способ синхронизации большинства задач. - person Olek; 10.02.2012
comment
Вы можете doInBackground запускать индивидуума там по порядку, пока не будете удовлетворены результатом, а затем вернуться. - person Heiko Rupp; 10.02.2012
comment
Это кажется разумным. Спасибо. Я попробую этот подход завтра и посмотрю, как он идет. - person Olek; 10.02.2012