Модифицировать обратный вызов на основной поток

С вызовом типа:

@GET("/user/{id}/data")
void getUserData(@Path("id") int id, Callback<Data> cb);

Обратный вызов должен выполняться в основном потоке (если не используется RxJava). Мои вопросы:

  • Где происходит синтаксический анализ (предположим, что я использую XML-конвертер для ответа процесса). Это основная нить или другая? Это зависит от реализации конвертера?
  • Если мне нужно включить некоторые (тяжелые) правила проверки/бизнес-правила, нужно ли создавать новый поток внутри вызываемого? Или это хорошо, если это нужно сделать в методах обратного вызова?

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

Ответы

Ответ 1

Где происходит синтаксический анализ (предположим, что я использую XML-конвертер для ответа процесса). Это основная нить или другая? Это зависит от реализации конвертера?

Всегда фоновый поток независимо от используемого вами конвертера.

Если мне нужно включить некоторые (тяжелые) правила проверки/бизнес-правила, мне нужно создать новый поток внутри вызываемого? Или это хорошо, если это сделать в методах обратного вызова?

Это довольно субъективно и есть много способов справиться с этим. Callback будет выполняться по основному потоку по умолчанию.

Вы можете изменить поток, на который будут вызываться обратные вызовы, путем доставки пользовательского Executor в RestAdapter.Builder. Это повлияет на все службы, созданные этим RestAdapter, однако это может быть не так, как вы хотите.

Нет ничего плохого в создании другого потока (или enqueueing on the executor) из Callback, если работа, которую вы хотите выполнить, может быть выполнена параллельно с обновлением пользовательского интерфейса (например, легким кэшированием).

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

В настоящее время мы используем RxJava (из которых Retrofit имеет экспериментальную поддержку) за то, что вы просите:

interface Foo {
  @GET("/")
  Observable<Foo> getFoo(String bar);
}

foo.getFoo()
  .mapMany(new ExpensiveOperationFunction())
  .observeOn(AndroidSchedulers.mainThread())
  .subscribe(new Observer<TransformedFoo>() { .. });